具有相同簽章的多個繼承函數不重載
在物件導向程式設計中,繼承允許類別從父類別繼承屬性和方法。然而,當多個繼承類別具有相同名稱但不同簽名的函數時,就會出現一個常見問題。
問題
考慮以下程式碼片段:
#include <iostream> struct Base1 { void foo(int); }; struct Base2 { void foo(float); }; struct Derived : public Base1, public Base2 { }; int main() { Derived d; d.foo(5); // Ambiguous call to "foo" std::cin.get(); return 0; }
此程式碼產生「對foo 的模糊呼叫」錯誤,表示對foo 的呼叫無法解析,因為存在多個繼承的具有相同名稱但不同簽名的函數。
說明
根據C 成員查找規則,當一個類別繼承自多個基類且有多個聲明時相同的名稱,任何隱藏的聲明都將被消除。如果產生的聲明集來自不同類型或包含來自不同基底類別的非靜態成員,則會出現歧義。
在上面的範例中,Base1 和 Base2 都定義了 foo 函數,但它們具有不同的簽章。當 Derived 繼承自 Base1 和 Base2 時,對於不同類型的 foo 有兩個不同的聲明。這會導致歧義,從而導致編譯錯誤。
解決方案
要解決歧義,您可以使用 using 聲明來指定要使用哪個基類的 foo 版本。例如:
class Derived : public Base1, public Base2 { using Base1::foo; };
此 using 聲明可確保在 Derived 中使用 Base1 中的 foo 函數。
問題
請注意,在您提供的第二個程式碼片段,衍生類別只有一個 foo 函數(帶有 float 參數)。這是因為 Base1 中的 foo 函數被 Derived 中的 foo 函數隱藏了。因此,d.foo(5) 使用來自 Derived 的 float 參數呼叫 foo 函數,而不是 Base1。
因此,回答標題中的問題,多個具有相同名稱但不同簽名的繼承函數不成立被視為重載函數,因為它會導致歧義。相反,編譯器需要使用 using 宣告或其他技術進行明確解析來指定應使用哪個函數。
以上是在 C 中如何解析具有相同名稱但不同簽章的多個繼承函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!