c++:操作符的动态多态性



是否可以对操作符进行动态多态性?我有一个基类指针的向量:

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方法,并在每个子类中重写它,以格式化给定输出流上的类实例。任务完成。

最新更新