首頁 > 後端開發 > C++ > 為什麼C繼承中會出現「未找到衍生類別中具有相同名稱但簽名不同的函數」的情況?

為什麼C繼承中會出現「未找到衍生類別中具有相同名稱但簽名不同的函數」的情況?

Mary-Kate Olsen
發布: 2024-12-21 03:40:09
原創
789 人瀏覽過

Why Does

隱藏在類別層次結構中的函數:理解「未找到衍生類別中具有相同名稱但不同簽章的函數」錯誤

在物件導向程式設計中,派生類別可以繼承來自他們的基底類別的成員。但是,當基底類別和衍生類別中存在名稱相同但簽名不同的函數時,可能會出現問題。這可能會導致錯誤,例如「在衍生類別中找不到具有相同名稱但不同簽章的函數。」

為了說明此問題,請考慮以下程式碼片段:

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
    }
};
登入後複製

編譯時這段程式碼中,編譯器在類別C 的bar() 函式中的foo(s) 呼叫中遇到錯誤。儘管基底類別 A 中存在 foo(string s) 函數,但編譯器無法辨識它是由於一種稱為函數隱藏的現象。

在這種情況下,B 類別中定義的foo(int i) 函數隱藏了從A 類別繼承的foo(string s) 函數這是因為類別層次結構中的名稱尋找在符合名稱的第一個聲明處停止。因此,當查找過程到達類別 B 時,它會找到 foo(int i) 函數並忽略基底類別中重寫的 foo(string s) 函數。

要解決此問題,必須明確地重新宣告基底類別函數在衍生類別的作用域內。透過使用using 關鍵字繼承基底類別函數,這兩個函數在衍生類別及其子類別中都變得可見:

class A {
public:
    void foo(string s) {}
};

class B : public A {
public:
    int foo(int i) {}
    using A::foo; // Redeclare base class foo function
};

class C : public B {
public:
    void bar() {
        string s;
        foo(s); // Now finds the base class foo(string s)
    }
};
登入後複製

透過將這一行合併到類別B 中,名稱查找將正確考慮foo( int i) 和foo(string s) 函數,解決函數隱藏問題。

以上是為什麼C繼承中會出現「未找到衍生類別中具有相同名稱但簽名不同的函數」的情況?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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