gpt4 book ai didi

C++:运算符的动态多态性

转载 作者:行者123 更新时间:2023-12-03 10:05:19 27 4
gpt4 key购买 nike

运算符是否可以具有动态多态性?我有一个基类指针 vector :

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;
}
现在,只需声明 format_output()作为普通 const virtual Event 中的方法父类(super class),并在每个子类中覆盖它,以在给定的输出流上格式化类的实例。任务完成。

关于C++:运算符的动态多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65764854/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com