Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么basic_streambuf::pubsekoff()不是纯虚拟函数?_C++_Visual Studio 2010_Gcc_Stream_Streambuf - Fatal编程技术网

C++ 为什么basic_streambuf::pubsekoff()不是纯虚拟函数?

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

如果查看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));
}
其中
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基类为每个函数定义契约,包括前置和后置条件。为了强制执行前置和后置条件,基类必须能够在调用虚函数之前和之后插入代码。它必须能够“捕获”调用,而不是直接将调用传递给派生类。