最佳答案
假设我有以下类层次结构:
class A
{
int foo;
virtual ~A() = 0;
};
A::~A() {}
class B : public A
{
int bar;
};
class C : public A
{
int baz;
};
什么是正确的方法来重载这些类的 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;
}
}
再说一次,我仍然需要施法(感觉不对)。有没有更好的方法来做这件事?
更新:
到目前为止只有两个答案,但是看起来正确的方法类似于赋值运算符:
任何尝试比较两个不同类型对象的用户都不会编译,因为基函数是受保护的,叶类可以利用父类的版本来比较该部分数据。