具有多重繼承的重載函數
在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