1

如果您查看<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_filebufbasic_stringbuf

4

1 回答 1

3

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

于 2013-02-22T13:47:22.617 回答