在面向对象编程领域,通常需要比较相关类的对象是否相等。然而,在处理类层次结构时,确定重载相等运算符的正确方法可能是一个挑战。
考虑以下类层次结构:
class A { int foo; virtual ~A() = 0; }; A::~A() {} class B : public A { int bar; }; class C : public A { int baz; };
有多种方法可以重载相等运算符这种层次结构的相等运算符。
将运算符==重载为自由函数允许直接比较对象而无需进行强制转换。然而,这种方法阻止了派生类(B 和 C)利用基类 (A) 的相等性检查。
使用虚拟成员函数方法,派生类可以覆盖相等性检查。然而,这需要动态转换以避免比较不同类型的对象,这可能会让人感觉很冗长。
首选方法是遵循 Scott Meyer 的“Effective C”概述的原则:
避免声明具体的基类,如果没有完整的实现,请使其抽象。
在非叶类中,提供受保护的非虚拟成员函数
公共非虚拟成员函数
bool operator==(const B& lhs, const B& rhs) { return lhs.isEqual(rhs) && lhs.bar == rhs.bar; }
这种方法可以防止意外回退,并在比较不同类型的对象时确保类型安全。
bool B::pubIsEqual(const A& rhs) const { const B* b = dynamic_cast<const B*>(&rhs); return b != NULL && *this == *b; }
以上是如何在类层次结构中安全地重载相等运算符?的详细内容。更多信息请关注PHP中文网其他相关文章!