为什么basic_streambuf :: pubseekoff()不是纯虚函数?

时间:2013-02-22 13:39:48

标签: c++ visual-studio-2010 gcc stream streambuf

如果查看VS2010中的<streambuf>头文件,您会看到此成员函数的定义为

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_filebufbasic_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声明为纯虚拟,并在每个派生类{{1}中定义它}和basic_filebuf

1 个答案:

答案 0 :(得分:3)

出于同样的原因,您通常不会创建虚拟功能 上市。公共函数定义了一个接口和基础 如果要强制执行,class需要能够捕获它们 那个界面。当控制反转时有例外 涉及,但在大多数情况下,你只是不做虚拟 功能公开。你将如何插入前后条件 检查你是否这样做? (看到 例如http://www.gotw.ca/publications/mill18.htm。)