运算符 <<和继承
我在 C++ 中有以下类:
class Event {
//...
friend ofstream& operator<<(ofstream& ofs, Event& e);
};
class SSHDFailureEvent: public Event {
//...
friend ofstream& operator<<(ofstream& ofs, SSHDFailureEvent& e);
};
我想要执行的代码是:
main() {
Event *e = new SSHDFailureEvent();
ofstream ofs("file");
ofs << *e;
}
这是一个简化,但我想要做的是将几种类型的事件写入文件中 在一个文件中。但是,不要使用运算符 << SSHDFailureEvent 的,它使用运算符 <<事件。有什么办法可以避免这种行为吗?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是行不通的,因为这会调用基类的
operator<<
。您可以在基类中定义一个虚函数
print
并在所有派生类中重新定义它,并仅定义一次operator<<
,如下所示:That would not work, as that would call
operator<<
for the base class.You can define a virtual function
print
in base class and re-define it all derived class, and defineoperator<<
only once as,尝试:
Try:
到目前为止的答案都有正确的想法,但在您继续执行并实现它之前,需要进行两个更改:
因此:
只要 print(或 printTo)是公共的,就不需要使流运算符重载友元。
您可以选择使用默认实现或使 print 方法成为纯虚拟方法。
您还可以将 print() 设为公共非虚拟函数,该函数调用受保护或私有虚拟函数,就像所有虚拟函数一样。
The answers so far have the right idea but before you run ahead and implement it, two changes:
Thus:
As long as print (or printTo) is public there is no need to make the stream operator overload a friend.
You have the option of having a default implementation or making the print method pure virtual.
You can also make
print()
a public non-virtual function that calls a protected or private virtual one, as is the case with all virtual functions.我在这里看到两种可能性:
在您尝试打印的类上调用显式打印方法。例如
在基地和儿童中实施。
尝试将基类动态转换为其子类。
I see two possibilities here:
Call an explicit print method on the class you are trying to print. For example implement
in the base and the children.
Attempt to dynamically cast the base class to it's children.