在我的程序中,我有以下类层次结构:
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==()
的问题。当然,比较实例A
和B
的实例是没有意义的,但比较Base
的两个实例应该是可能的。 (你无法比较狗和猫,但你可以比较两只动物)
我想要以下结果:
A == B
=>false
A == A
=>true
或false
,具体取决于两个实例的有效值
B == B
=>true
或false
,具体取决于两个实例的有效值
答案 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)
我现在无法制作反例,但据我记忆,比较运算符(作为传递,反身和对称的东西)将始终中断(并成为恶意错误的来源)当与继承结合时。可能它不会破坏你的应用程序,你的用例,半年后当你继承你的子类...