在物件導向程式設計領域,通常需要比較相關類別的物件是否相等。然而,在處理類別層次結構時,確定重載相等運算子的正確方法可能是一個挑戰。
考慮以下類別層次結構:
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中文網其他相關文章!