首頁 >後端開發 >C++ >為什麼 C 需要明確重寫基底類別方法?

為什麼 C 需要明確重寫基底類別方法?

Barbara Streisand
Barbara Streisand原創
2024-11-02 14:35:29718瀏覽

Why Does C   Require Explicit Overriding for Base Class Methods?

C 重載解析:了解顯式重寫的需要

在物件導向程式設計中,重載解析是一種至關重要的機制,可以在多個方法時選擇正確的方法類別層次結構中存在名稱相同但參數不同的方法。然而,C 中重載解析的行為有時可能需要程式設計師的額外指導。

考慮以下範例:

class A {
public:
    int DoSomething() { return 0; };
};

class B : public A {
public:
    int DoSomething(int x) { return 1; };
};

int main() {
    B* b = new B();
    b->A::DoSomething();    // Explicit call to base class method
    // b->DoSomething();    // Compiler error: DoSomething() is ambiguous
    delete b;
    return 0;
}

在此範例中,有兩個名為「DoSomething」的方法:一個在基底類別 A 中,一個在衍生類別 B 中。重載解析應根據上下文和參數清單自動決定要呼叫哪個方法。但是,在這種情況下,編譯器會為第二行產生錯誤。

這是因為預設情況下,C 僅考慮名稱匹配的最小可能範圍。在此範例中,編譯器在衍生類別 B 中看到 DoSomething(int) 方法,並嘗試將其與參數清單進行匹配,但失敗了。直到名稱符合步驟之後才考慮基底類別 A 中的方法。

要解決這種歧義,必須使用語法 b->A::DoSomething() 明確指定基類方法。這明確地通知編譯器應該呼叫基底類別中的方法,即使在衍生類別中存在同名方法。

或者,可以使用using 聲明來引入基類方法進入派生類的範圍,例如:

class B : public A {
public:
    using A::DoSomething;
    // …
};

這允許調用A 中的DoSomething() 方法,而無需顯式A :: 前綴。但是,需要注意的是,此解決方案可能會對類別層次結構中的其他虛擬方法產生影響。

以上是為什麼 C 需要明確重寫基底類別方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn