是否可以对操作符进行动态多态性?我有一个基类指针的向量:
std::vector<Event*> events;
,其中每个事件是一个不同的派生类(例如StartEvent
)。所有的派生类都实现了它们的operator<<
,这样它们就可以被打印到控制台。
但是,这不起作用:
std::for_each(events.cbegin(), events.cend(), [] (const Event *ev) {
std::cout << *ev << std::endl;
});
我得到这个错误:
error: no match for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘const Event’)
std::cout << *ev << std::endl;
我试过了:
class Event {
protected:
Event() { }
virtual std::ostream& operator<< (std::ostream &stream);
public:
const int32_t timestamp;
};
没有帮助。如果operator<<
在派生类中实现为friend
,这是一个问题吗?
friend std::ostream& operator<< (std::ostream &stream, const StartEvent& se) {
/* do stuff */
}
经典的解决方案是将<<
重载声明为基类的friend
,然后使用它来调用适当的虚方法:
std::ostream& operator<< (std::ostream &stream, const Event &e) {
e.format_output(stream);
return stream;
}
现在,只需在Event
超类中将format_output()
声明为普通的const virtual
方法,并在每个子类中重写它,以格式化给定输出流上的类实例。任务完成。