假设我有以下类层次结构:
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)
再次,我仍然需要施放(并且感觉不对).有没有一种首选的方法呢?
更新:
到目前为止只有两个答案,但看起来正确的方式类似于赋值运算符:
任何用户尝试比较两个不同类型的对象都不会编译,因为基本功能受到保护,叶子类可以利用父类的版本来比较那部分数据.