由于ifstream
和istringstream
是从istream
继承的,我预计istream
(或更确切地说,basic_istream
)会声明operator>>
像这样的原始类型:
virtual istream& istream::operator>>(char &c);
virtual istream& istream::operator>>(int &i);
快速浏览消息来源表明情况并非如此 - 这些功能看起来并不虚拟。我错过了什么吗?
[上下文是我试图滚动istreams执行二进制I / O,纠正字节顺序等。]
答案 0 :(得分:2)
不,他们不是虚拟的。基本流功能中有一些虚函数,但是输入/输出实际数据的部分内部,而不是类型到字符串的格式,这是operator>>
中实际发生的事情。
编辑:我相信所有虚拟功能都是"隐藏"来自公共接口。 basic_streambuf::pubseekpos
至少在gcc提供的标头中作为对虚拟seekpos
的调用。
答案 1 :(得分:2)
它们不是虚拟的,但只有istream/ostream
的重载,所有派生类都使用这些重载。所有stream
类都使用内部缓冲区,即basic_streambuf or derived from it。 basic_streambuf
有许多虚函数,因此根据stream
编写streambuf
类应该不是一个大问题。