C++ 为什么basic_streambuf::pubsekoff()不是纯虚拟函数?
如果查看VS2010中的C++ 为什么basic_streambuf::pubsekoff()不是纯虚拟函数?,c++,visual-studio-2010,gcc,stream,streambuf,C++,Visual Studio 2010,Gcc,Stream,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
头文件,您将看到此成员函数的定义如下
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\u filebuf
和basic\u stringbuf
中被重写,并且在基类basic\u 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));
}
我找不到\u BADOFF
的定义,但它可能是-1
。但这在这里并不重要。由于类basic\u streambuf
是一个抽象类(其构造函数受保护),因此永远不会调用此函数或pubsekoff
还要注意,
gcc
编译器使用相同的技术。为什么这两个编译器必须使用seekoff()
成员函数,与其简单地在basic\u streambuf
中将publiseekoff
声明为纯虚拟,并在每个派生类basic\u filebuf
和basic\u stringbuf
中定义它,原因与通常不生成虚拟函数相同
公众。公共函数定义了一个接口和基函数
类需要能够捕获它们,如果它想强制
这个接口。当控制反转时,也有例外
是涉及的,但在大多数情况下,你只是不做虚拟的
公共职能。如何插入前置和后置条件
检查你有没有?(见
可能是因为标准要求它?“…如果基类想要强制实现该接口,则需要能够捕获它们”。我不知道你在这里说什么。@user1577873基类为每个函数定义契约,包括前置和后置条件。为了强制执行前置和后置条件,基类必须能够在调用虚函数之前和之后插入代码。它必须能够“捕获”调用,而不是直接将调用传递给派生类。