首頁 > 後端開發 > C++ > 如何在類別層次結構中安全地重載相等運算子?

如何在類別層次結構中安全地重載相等運算子?

Barbara Streisand
發布: 2024-11-07 04:30:02
原創
408 人瀏覽過

How to Safely Overload the Equality Operator in Class Hierarchies?

類別層次結構的運算子重載:一種綜合方法

在物件導向程式設計領域,通常需要比較相關類別的物件是否相等。然而,在處理類別層次結構時,確定重載相等運算子的正確方法可能是一個挑戰。

考慮以下類別層次結構:

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”概述的原則:

抽象基礎類

避免聲明具體的基類,如果沒有完整的實現,請使其抽象。

受保護的非虛擬成員函數

在非葉類中,提供受保護的非虛擬成員函數

用於相等性檢查的非虛擬輔助函數(例如isEqual())。

公共非虛擬成員函數

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板