衍生類別繼承中的函數名稱衝突
考慮以下程式碼片段:
class A { public: void foo(string s) {} }; class B : public A { public: int foo(int i) {} }; class C : public B { public: void bar() { string s; foo(s); } };
編譯此程式碼時,編譯器產生以下內容錯誤:
error: no matching function for call to 'C::foo(std::string&)' candidates are: int B::foo(int)
此錯誤是由於函數名稱遮蔽而發生的。當衍生類別 B 定義了與其基底類別 A 中的函數同名的函數時,衍生類別函數會隱藏基底類別函數。
名稱查找範圍
類作用域中的名稱查找遵循以下步驟:
解
要解決函數名稱衝突,您可以在衍生類別的作用域中重新宣告基底類別函數。這確保了這兩個函數在衍生類別及其後代中都是可見的:
class A { public: void foo(string s) {} }; class B : public A { public: int foo(int i) {}; using A::foo; }; class C : public B { public: void bar() { string s; foo(s); } };
透過添加using A::foo;,您指定基類A 中的foo 函數在衍生類別中也可用B 類。現在,程式碼將正確編譯。
附加註解
「下列步驟定義類別作用域中名稱查找的結果,C.首先,考慮該類別及其每個基類子物件中名稱的每個聲明,一個子物件中的成員名稱 f隱藏了子對像中的成員名稱 f。因此,即使B中的foo函數是私有的,A中的foo函數仍然找不到。
以上是如何解決C衍生類別繼承中的函數名稱衝突?的詳細內容。更多資訊請關注PHP中文網其他相關文章!