首頁 >後端開發 >C++ >如何解決C衍生類別繼承中的函數名稱衝突?

如何解決C衍生類別繼承中的函數名稱衝突?

Patricia Arquette
Patricia Arquette原創
2024-12-30 13:40:16630瀏覽

How to Resolve Function Name Collision in C   Derived Class Inheritance?

衍生類別繼承中的函數名稱衝突

考慮以下程式碼片段:

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 中的函數同名的函數時,衍生類別函數會隱藏基底類別函數。

名稱查找範圍

類作用域中的名稱查找遵循以下步驟:

  1. 考慮類別及其基類中名稱的所有聲明類別。
  2. 消除基類中其他聲明隱藏的任何聲明。

要解決函數名稱衝突,您可以在衍生類別的作用域中重新宣告基底類別函數。這確保了這兩個函數在衍生類別及其後代中都是可見的:

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

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