【问题标题】:C++: Are iostream operator<< and operator>>s for primitive types virtual?C++:基本类型的 iostream operator<< 和 operator>> 是虚拟的吗?
【发布时间】:2016-04-02 05:27:12
【问题描述】:

由于ifstream 和istringstream 继承自istream,我预计istream(或者更确切地说,basic_istream)会为这样的原始类型声明operator&gt;&gt;:

virtual istream& istream::operator>>(char &c); virtual istream& istream::operator>>(int &i);

快速浏览源代码表明情况并非如此——这些函数看起来不是虚拟的。我错过了什么吗?

[上下文是我正在尝试滚动执行二进制 I/O、纠正字节顺序等的 istreams。]

【问题讨论】:

  • 简短回答 - 它们不是虚拟的,但它们通过调用其他虚拟函数来工作

标签: c++ io virtual iostream operator-keyword


【解决方案1】:

不,它们不是虚拟的。基本流功能中有一些虚函数,但那是在输入/输出实际数据的部分,而不是在operator&gt;&gt; 中实际发生的字符串格式。

编辑:我相信所有虚拟功能都对公共接口“隐藏”了。 basic_streambuf::pubseekpos 至少在 gcc 提供的标头中作为对虚拟 seekpos 的调用。

【讨论】:

  • “基本流功能中的虚拟函数”是公共接口的一部分,还是依赖于实现?
【解决方案2】:

它们不是虚拟的,但只有 istream/ostream 的重载,所有派生类都使用这些重载。所有stream 类都使用内部缓冲区,即basic_streambuf or derived from it。 basic_streambuf 有很多虚函数,所以用streambuf 编写你的stream 类应该不是什么大问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2014-05-01
    • 2020-04-13
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多