亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問為什么具有相同名稱但簽名不同的多重繼承函數不會被視為重載函數?

請問為什么具有相同名稱但簽名不同的多重繼承函數不會被視為重載函數?

C++
侃侃無極 2019-09-05 12:06:17
為什么具有相同名稱但簽名不同的多重繼承函數不會被視為重載函數?下面的代碼片段在編譯過程中會產生一個“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聲明指定的聲明類型的每個子對象。AABC如果生成的聲明集不是來自相同類型的子對象,或者集合具有非靜態成員并且包括來自不同子對象的成員,則存在歧義并且程序格式錯誤。否則該集合是查找的結果。

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::fB::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版本。



查看完整回答
反對 回復 2019-09-10
  • 3 回答
  • 0 關注
  • 481 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號