2014-03-26 79 views
1

請考慮下面的例子(link to ideone):重載決策

#include <iostream> 

class Base1 
{ 
public: 
    void doit(){} 
}; 

class Base2 
{ 
    void doit(int x){} 
}; 

class Derrived : public Base1, public Base2 
{ 
}; 

using namespace std; 

int main() 
{ 
    cout << "Hello World" << endl; 
    Derrived d; 
    d.doit(); // doesn't work - error: request for member ‘doit’ is ambiguous 
    d.::Base1::doit(); //works 
    return 0; 
} 

都和基礎1具有和Base2成員函數DOIT與不同的輸入參數,因此在理論上重載應自動解決。 但嘗試撥打 d.doit(); 失敗,錯誤

prog.cpp: In function ‘int main()’: 
prog.cpp:36:6: error: request for member ‘doit’ is ambiguous 
    d.doit(); // doesn't work - error: request for member ‘doit’ is ambiguous 
    ^
prog.cpp:18:7: note: candidates are: void Base2::doit(int) 
    void doit(int x) 
    ^
prog.cpp:6:10: note:     void Base1::doit() 
    void doit() 
     ^

,我必須鍵入d :: ::基礎1度特();使其工作。

爲什麼編譯器無法解析哪個函數調用沒有我明確指定它?它預期的行爲?

+0

http://stackoverflow.com/questions/5368862/why-do-multiple-inherited-functions-with-same-name-but-different-signatures-not?rq=1的副本 – mtripp100

+0

@ mtripp100 - 是的,對不起,我找不到其他問題,但看起來像是重複的。我應該刪除它,還是標記爲重複? –

回答

0

是的,這是預期的行爲。

在重載解析之前,執行名稱查找,該查詢具有自己的一組規則。它必須找到一個明確的名字,而且你的案例中沒有一個。