C++ 中具有双重调度的运算符 ==

发布于 2024-09-11 23:24:51 字数 218 浏览 9 评论 0原文

一个应该如何实现

operator==(const Base& base)

来比较子类,当调用时,调用将被正确分派

Base* base1 = new Derived1();
Base* base2 = new Derived2();
base1->operator==(*base2)?

How should one implement

operator==(const Base& base)

to compare subclasses s.t. the calls would be properly dispatched when called as

Base* base1 = new Derived1();
Base* base2 = new Derived2();
base1->operator==(*base2)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

憧憬巴黎街头的黎明 2024-09-18 23:24:51
  1. 将operator==实现为独立函数。
  2. 让它对参数之一调用虚拟方法(例如 IsEqual()),

这会让您到达调用的位置

Derived1::IsEqual(const Base& base)

。从这里您可以选择

  1. 使用 RTTI 来进行动态广播<> base 到 Derived1
  2. 如果导出的数量很小且有限,则可以实现

    virtual bool Base::IsEqualToDerived(const Derived1& d) {return false};
    virtual bool Base::IsEqualToDerived(const Derived2&d) {return false};
    

为虚方法。在 Derived1 中,您可以覆盖并比较真实值。

  1. Implement operator== as a free standing function.
  2. Have it call a virtual method on one of the arguments (e.g. IsEqual())

That gets you to the point where you have

Derived1::IsEqual(const Base& base)

Called. From here you have some options

  1. Use RTTI to dynamic_cast<> base to Derived1
  2. If the number of derived is small and finite, you can implement

    virtual bool Base::IsEqualToDerived(const Derived1& d) {return false};
    virtual bool Base::IsEqualToDerived(const Derived2& d) {return false};
    

as virtual methods. In Derived1, you override and compare for real.

梦里南柯 2024-09-18 23:24:51

这看起来像是关于类和类型的通用 C++ 问题,而不是关于操作符 == 的特定问题。据我所知,在您给出的特定示例中,除了使用 dynamic_cast

This seems like a generic C++ question on classes and type rather than a specific question on the operator== . Up to my knowledge, in the particular example you are giving there is no other way but to use dynamic_cast

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文