比较对象和继承

时间:2010-05-13 08:49:51

标签: c++ inheritance comparison operator-overloading

在我的程序中,我有以下类层次结构:

class Base // Base is an abstract class
{
};

class A : public Base
{
};

class B : public Base
{
};

我想做以下事情:

foo(const Base& one, const Base& two)
{
  if (one == two)
  {
    // Do something
  } else
  {
    // Do something else
  }
}

我在这里遇到有关operator==()的问题。当然,比较实例AB的实例是没有意义的,但比较Base的两个实例应该是可能的。 (你无法比较狗和猫,但你可以比较两只动物)

我想要以下结果:

  

A == B => false

     

A == A => truefalse,具体取决于两个实例的有效值

     

B == B => truefalse,具体取决于两个实例的有效值

我的问题是:这是一个很好的设计/想法吗?这甚至可能吗?我应该写什么函数/重载?

3 个答案:

答案 0 :(得分:3)

class Base // Base is an abstract class
{
    virtual bool equals(const Base& b) = 0;
};

class A : public Base
{
    virtual bool equals(const Base& base)
    {
        if (const A* a = dynamic_cast<const A*>(&base))
        {
            // Return true iff this and a are equal.
        }
        return false;
    }
};

class B : public Base
{
    virtual bool equals(const Base& base)
    {
        if (const B* b = dynamic_cast<const B*>(&base))
        {
            // Return true iff this and b are equal.
        }
        return false;
    }
};

答案 1 :(得分:1)

在基数处重载运算符:子类引用将被转换为基类引用。

看不到设计的任何问题 - 没有更多的背景。

答案 2 :(得分:0)

我现在无法制作反例,但据我记忆,比较运算符(作为传递,反身和对称的东西)将始终中断(并成为恶意错误的来源)当与继承结合时。可能它不会破坏你的应用程序,你的用例,半年后当你继承你的子类...