2010-02-03 55 views
2

我遇到了我的類的問題,將一個const對象(多態結構)傳遞給一個顯式構造函數,該函數將const引用傳遞給基類那種多態結構。 這裏是樣品(這是不是從我的代碼,它是解釋在這裏)明確傳遞一個const對象到一個構造函數,該構造函數接受一個多態類的const引用

class Base 
{ 
... 
} 

class Derived:public Base 
{ 
... 
} 

class Problem 
{ 
    Problem(const Base&); 
... 
} 

void myFunction(const Problem& problem) 
{ 
    ... 
} 

int main() 
{ 
    //explicit constructor with non const object 
    Derived d; 
    Problem no1(d); //this is working fine 
    myFunction(no1); 

    //implicit constructor with const object 
    Problem no2=Derived(); //this is working fine, debugged and everything called fine 
    myFunction(no2); //is working fine 

    //explicit constructor with const object NOT WORKING 
    Problem no3(Derived()); //debugger jumps over this line (no compiler error here) 
    myFunction(no3); //this line is NOT COMPILING at all it says that: 
    //no matching function for call to myFunction(Problem (&)(Derived)) 
    //note: candidates are: void MyFunction(const Problem&) 
} 

它似乎是工作的罰款與第二版(顯式的構造函數調用的問題),只有當我明確投的派生類對象其基類作爲它的基礎,如:

Problem(*(Base*)&Derived); 

我不知道叫impicitly和明確的問題類的構造函數之間的差別。 謝謝!

+0

您在第二類聲明中切換了「基本」和「派生」。這是一個錯字嗎?另外,即使在沒有優化的'Debug'配置文件中編譯時,「調試器跳過這一行」的註釋是否適用? –

+0

您正在創建基類的對象並將它們傳遞 - 您不會獲得多態行爲。您需要一個引用或指向基類的指針才能獲得所需的行爲。鑄造不是一個解決方案。 – dirkgently

+0

該參數是const引用,所以有多態行爲的參考。 – user265149

回答

6

問題是你沒有聲明一個對象,而是一個功能:

Problem no3(Derived()); 
// equivalent to: 
Problem no3(Derived); // with parameter name omitted 

用途:

Problem no3((Derived())); 
// extra parens prevent function-declaration interpretation 
// which is otherwise required by the standard (so that the code isn't ambiguous) 

這是C++繼承了C'S聲明語法的怪癖。

更多的例子:

void f(int(a)); /* same as: */ void f(int a); 

void g() { 
    void function(int); // declare function 
    void function(int()); // we can declare it again 
    void function(int=42); // add default value 
    function();   // calls ::function(42) ('function' in the global scope) 
} 
// 'function' not available here (not declared) 

void function(int) {} // definition for declarations inside g above 
+0

該死的,你是對的。非常感謝!雖然前一段時間我遇到了同樣的問題,但我現在沒有想到它。 – user265149

0

供將來參考,這是被稱爲最令人頭痛的解析,看到另一個StackOverflow thread以這個暱稱的原點的怪癖。

相關問題