【发布时间】:2013-02-22 13:39:47
【问题描述】:
如果你在 VS2010 中查看<streambuf>header 文件,你会看到这个成员函数的定义为
pos_type pubseekoff(off_type _Off, ios_base::seekdir _Way,
ios_base::openmode _Mode = ios_base::in | ios_base::out)
{ // change position by _Off, according to _Way, _Mode
return (seekoff(_Off, _Way, _Mode));
}
其中seekoff是一个虚函数,它在派生类basic_filebuf和basic_stringbuf中被覆盖,在基类basic_streambuf中什么也不做,如下所示:
virtual pos_type seekoff(off_type, ios_base::seekdir,
ios_base::openmode = ios_base::in | ios_base::out)
{ // change position by offset, according to way and mode
return (streampos(_BADOFF));
}
我找不到_BADOFF 的定义,但它可能是-1。但这在这里真的无关紧要。这个函数,也不是pubseekoff,永远不会被调用,因为类basic_streambuf是一个抽象类(它的构造函数是受保护的)。
还要注意gcc 编译器使用相同的技术。为什么这两个编译器必须求助于seekoff() 成员函数,而不是简单地将pubseekoff 声明为basic_streambuf 中的纯虚拟并在派生类basic_filebuf 和basic_stringbuf 中定义它?
【问题讨论】:
-
可能是因为标准要求它?
标签: c++ visual-studio-2010 gcc stream streambuf