C++:原始类型的 iostream operator<< 和 operator>> 是虚拟的吗?
C++: Are iostream operator<< and operator>>s for primitive types virtual?
由于 ifstream
和 istringstream
继承自 istream
,我预计 istream
(或者更确切地说,basic_istream
)会声明 operator>>
对于这样的原始类型:
virtual istream& istream::operator>>(char &c);
virtual istream& istream::operator>>(int &i);
快速浏览一下源代码就会发现情况并非如此——这些函数看起来并不是虚拟的。我错过了什么吗?
[上下文是我正在尝试滚动执行二进制 I/O、字节顺序正确等的 istream。]
不,它们不是虚拟的。基本流功能中有一些虚函数,但那是 input/output 实际数据的部分,而不是将类型格式化为字符串的部分,这是 operator>>
.[=13= 中实际发生的事情]
编辑:我相信所有虚拟功能都是来自 public 接口的 "hidden"。 basic_streambuf::pubseekpos
至少在 gcc 中提供 headers 作为对虚拟 seekpos
的调用。
它们不是虚拟的,但只有 istream/ostream
的重载,所有派生的 classes 都使用。所有stream
classes内部都使用了一个buffer,也就是basic_streambuf or derived from it。 basic_streambuf
有很多虚函数,所以用 streambuf
.
来写你的 stream
class 应该不是什么大问题
由于 ifstream
和 istringstream
继承自 istream
,我预计 istream
(或者更确切地说,basic_istream
)会声明 operator>>
对于这样的原始类型:
virtual istream& istream::operator>>(char &c);
virtual istream& istream::operator>>(int &i);
快速浏览一下源代码就会发现情况并非如此——这些函数看起来并不是虚拟的。我错过了什么吗?
[上下文是我正在尝试滚动执行二进制 I/O、字节顺序正确等的 istream。]
不,它们不是虚拟的。基本流功能中有一些虚函数,但那是 input/output 实际数据的部分,而不是将类型格式化为字符串的部分,这是 operator>>
.[=13= 中实际发生的事情]
编辑:我相信所有虚拟功能都是来自 public 接口的 "hidden"。 basic_streambuf::pubseekpos
至少在 gcc 中提供 headers 作为对虚拟 seekpos
的调用。
它们不是虚拟的,但只有 istream/ostream
的重载,所有派生的 classes 都使用。所有stream
classes内部都使用了一个buffer,也就是basic_streambuf or derived from it。 basic_streambuf
有很多虚函数,所以用 streambuf
.
stream
class 应该不是什么大问题