」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼多重繼承不支援重載同名不同簽章的函數?

為什麼多重繼承不支援重載同名不同簽章的函數?

發佈於2024-12-23
瀏覽:844

Why Doesn't Multiple Inheritance Support Overloaded Functions with the Same Name but Different Signatures?

具有多重繼承的重載函數

在C 中,函數重載允許在單一作用域內定義多個具有相同名稱的函數,前提是他們有不同的參數列表。但是,此行為不會擴展到具有相同名稱但不同簽名的多個繼承函數。這就提出了一個問題:為什麼此類函數不被視為重載?

根據 C 標準第 10.2/2 節,成員查找規則規定在名稱查找期間不考慮隱藏聲明。當多個基底類別定義名稱相同但參數不同的函數時,這些函數可能會相互隱藏。因此,如果產生的宣告集不是來自相同類型的子對象,或包含非靜態成員和來自不同子對象的成員,則會出現歧義,並且程式被視為格式錯誤。

例如:

class A {
public:
  int f(int);
};

class B {
public:
   int f();
};

class C : public A, public B {};

在這種情況下,f 是不明確的,因為它是在兩個不同的基底類別(A 和 B)中定義的。因此,以下從 C 類別對 f 的呼叫是不正確的:

int main() {
  C c;
  c.f();  // ambiguous
}

要解決這種歧義,您可以使用 using 宣告來指定哪個基底類別實作 f 函數。例如:

class C : public A, public B {
     using A::f;
     using B::f;
};

經過此修改,c.f() 現在從 A 類別明確呼叫 f,解決了歧義。

相反,您提供的第二個程式碼範例可以工作,因為定義了 foo(float)在 Derived 類別的範圍內,並且不是從多個基類繼承的。因此,d.foo(5)直接呼叫foo(float)函數,沒有任何歧義。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3