【问题标题】:Why basic_streambuf::pubseekoff() is not a pure virtual function?为什么 basic_streambuf::pubseekoff() 不是纯虚函数?
【发布时间】:2013-02-22 13:39:47
【问题描述】:

如果你在 VS2010 中查看<streambuf>header 文件,你会看到这个成员函数的定义为

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 中的纯虚拟并在派生类basic_filebufbasic_stringbuf 中定义它?

【问题讨论】:

  • 可能是因为标准要求它?

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


【解决方案1】:

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

【讨论】:

  • "...如果要强制执行该接口,基类需要能够捕获它们"。我不知道你在说什么。
  • @user1577873 基类定义了每个函数的契约,包括前置条件和后置条件。为了强制执行前置条件和后置条件,基类必须能够在调用虚函数之前和之后插入代码。它必须能够“捕获”调用,而不是让调用直接传递到派生类。
猜你喜欢
  • 2015-08-27
  • 2012-12-16
  • 2011-01-10
  • 2011-08-02
  • 2010-11-07
  • 2022-01-13
  • 2012-10-06
  • 2020-06-09
相关资源
最近更新 更多