2013-02-12 46 views
0
class A { 
    public: 
    virtual int test()=0; 
}; 

class B : public A { 
    public: 
    int test(){return 10;} 
}; 


B *b = new B(); 
b->test(); // would return 10; 

而:C++基類的成員是否真的需要虛擬才能被派生類覆蓋?

class A { 
    public: 
    int test(){return 0;} 
}; 

class B : public A { 
    public: 
    int test(){return 10;} 
}; 


B *b = new B(); 
b->test(); // **would return 0**; 

爲什麼它返回 「」 在這裏?這對我來說毫無意義,因爲我認爲派生類(B)的(類型重載)成員是第一個! 這裏發生了什麼?

+2

'B-> test()'不能編譯。是什麼讓你認爲第二個例子的結果爲零? – aschepler 2013-02-12 19:24:31

+2

是的,你的想法是不正確的。即使您將B更改爲B來編譯它,它也會返回10. – 2013-02-12 19:25:54

+0

您嘗試過嗎?我真的不認爲它會返回0 – 2013-02-12 19:27:19

回答

4

除了無效的語法(B->test();它應該是b->test();),第二個也將返回10

相反,如果你會寫:

A* a = new B(); 
a->test(); 

這將返回0或10取決於A :: test是否是虛擬的。

+0

請訪問:http://www.cplusplus.com/doc/tutorial/polymorphism/和Ctrl + F「varify」並查看上面的示例。現在,如果我使基礎虛擬功能不是虛擬的,並將「ppoly1」不是作爲多邊形分配,而是作爲CRectangle分配,它將返回0! – user1511417 2013-02-12 19:39:26

+0

@ user1511417:花時間重新閱讀鏈接頁面中的代碼。如果指針/引用的靜態類型是* base *,那麼只會獲得基類的實現。 – 2013-02-12 19:46:31

相關問題