為什么具有相同名稱但簽名不同的多重繼承函數不會被視為重載函數?下面的代碼片段在編譯過程中會產生一個“foo的foo調用”錯誤,我想知道如果沒有完全限定對foo的調用,是否有任何方法解決這個問題:#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);
std::cin.get();
return 0;}所以,問題就像標題所說的那樣。想法?我的意思是,以下工作完美無瑕:#include <iostream>struct Base{
void foo(int){
}};struct Derived : public Base{
void foo(float){
}};int main(){
Derived d;
d.foo(5);
std::cin.get();
return 0;}
3 回答

Cats萌萌
TA貢獻1805條經驗 獲得超9個贊
成員查找規則在第10.2 / 2節中定義
以下步驟定義類范圍中的名稱查找結果
C
。首先,考慮類中及其每個基類子對象中的名稱的每個聲明。如果f
一個子對象中B
的成員名是基類子對象,則f
該子對象中的成員名稱隱藏成員名稱。任何如此隱藏的聲明都不予考慮。由using聲明引入的每個聲明都被認為來自于包含using聲明指定的聲明類型的每個子對象。A
A
B
C
如果生成的聲明集不是來自相同類型的子對象,或者集合具有非靜態成員并且包括來自不同子對象的成員,則存在歧義并且程序格式錯誤。否則該集合是查找的結果。
class A {public: int f(int);};class B {public: int f();};class C : public A, public B {};int main(){ C c; c.f(); // ambiguous}
因此,您可以使用using
聲明A::f
并B::f
解決這種歧義
class C : public A, public B { using A::f; using B::f;};int main(){ C c; c.f(); // fine}
第二個代碼完美無缺,因為void foo(float)
它在C的范圍內。實際上是d.foo(5);
電話void foo(float)
而不是int
版本。
- 3 回答
- 0 關注
- 481 瀏覽
添加回答
舉報
0/150
提交
取消