2013-03-04 18 views
0

我知道有點多態的,但我用隱參考位丟在這裏,在隱式轉換從BAB調用該方法,但有明確從A方法被調用,這是有道理的,但它只在這些方法是虛擬的情況下才起作用,否則在兩種情況下都會輸入ShowA(調用類A的方法)。顯式轉換VS虛函數

class A 
{ 
public: 
    A(){}; 
    ~A(){} 
public: 
    int n; 
     virtual void Show(){ cout << "ShowA" << endl; }; 
}; 

class B : public A 
{ 
public: 
    B(){}; 
    ~B(){} 
    virtual void Show() { cout << "ShowB" << endl; } 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    B b; 
    A& a = b; //ShowB 
    A& a = (A)b; //ShowA 
    a.Show(); 

    //Extra: 
    A& extra = extra; 

    return 0; 
} 

另外有爲什麼A& extra = extra並不被禁止,或者僅僅是因爲要禁止毫無意義的事情不太重要的一個原因?

+0

這樣的合法聲明會是相當複雜的所以......問題是什麼? – Yaniv 2013-03-04 01:28:03

回答

2
A& a = (A)b; 

這創建A類型的臨時對象,複製的b基類部分。然後它試圖參考這個臨時的。

幸運的是,C++語言不允許您對臨時文件進行(非常量)引用,從而防止您意外犯這類錯誤。

不幸的是,你的編譯器提供了一個「語言擴展」,它可以讓你做到這一點,所以如果你必須使用該編譯器,那麼你需要更加小心。

一般情況下,避免像瘟疫這樣的C型施法。當你真的需要一個明確的轉換時,可以使用最具限制性的C++風格轉換來幫助編譯器捕獲錯誤。

此外,有沒有原因A& extra = extra是不是禁止,或者只是因爲沒有什麼重要的禁忌無意義的事情?

沒有很好的理由允許;據推測,這不是禁止的,因爲禁止沒有禁止像int i, &r=i;void *p = &p;

+0

非常好的答案,謝謝邁克! – 2013-03-04 17:49:51