如果您查看<streambuf>
VS2010 中的头文件,您会看到此成员函数的定义为
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));
}
whereseekoff
是一个虚函数,它在派生类中被覆盖,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
. 但这在这里真的无关紧要。这个函数 norpubseekoff
永远不会被调用,因为该类basic_streambuf
是一个抽象类(它的构造函数是受保护的)。
另请注意,gcc
编译器使用相同的技术。为什么这两个编译器必须求助于seekoff()
成员函数,而不是简单地声明pubseekoff
为纯虚函数basic_streambuf
并在每个派生类中定义它basic_filebuf
和basic_stringbuf
?