在物件導向程式設計中,重載解析是一種至關重要的機制,可以在多個方法時選擇正確的方法類別層次結構中存在名稱相同但參數不同的方法。然而,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中文網其他相關文章!