相关疑难解决方法(0)

为类层次结构重载operator ==的正确方法是什么?

假设我有以下类层次结构:

class A
{
    int foo;
    virtual ~A() = 0;
};

A::~A() {}

class B : public A
{
    int bar;
};

class C : public A
{
    int baz;
};
Run Code Online (Sandbox Code Playgroud)

operator==为这些类重载的正确方法是什么?如果我让它们都是自由函数,那么B和C不能在没有强制转换的情况下利用A的版本.它还会阻止某人进行只有A引用的深度比较.如果我将它们作为虚拟成员函数,那么派生版本可能如下所示:

bool B::operator==(const A& rhs) const
{
    const B* ptr = dynamic_cast<const B*>(&rhs);        
    if (ptr != 0) {
        return (bar == ptr->bar) && (A::operator==(*this, rhs));
    }
    else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

再次,我仍然需要施放(并且感觉不对).有没有一种首选的方法呢?

更新:

到目前为止只有两个答案,但看起来正确的方式类似于赋值运算符:

  • 使非叶类抽象化
  • 在非叶类中受保护的非虚拟
  • 在叶类中公共非虚拟

任何用户尝试比较两个不同类型的对象都不会编译,因为基本功能受到保护,叶子类可以利用父类的版本来比较那部分数据.

c++ operator-overloading

48
推荐指数
4
解决办法
7万
查看次数

C++中的多个调度

我想了解多次发送是什么.我阅读了很多不同的文本,但我仍然不知道多重发送是什么以及它有什么好处.也许我缺少的是使用多个调度的代码片段.请问,您是否可以使用多个调度在C++中编写一小段代码,以便我可以看到它无法正确编译/运行,因为C++只有单个调度?我需要看到差异.谢谢.

c++ multiple-dispatch

36
推荐指数
3
解决办法
1万
查看次数