2010-12-10 122 views
6
class Base 
{ 
public: 
Base() 
{ 
cout<<"base class"<<endl; 
fun(); 
} 
virtual void fun(){cout<<"fun of base"<<endl;} 
}; 

class Derive:public Base 
{ 
public: 
Derive() 
{ 
cout<<"derive class"<<endl; 
fun(); 
} 
void fun(){ cout<<"fun of derive"<<endl;} 
}; 

void main() 
{ 
Derive d; 
} 

輸出是:爲什麼我的虛擬方法沒有被覆蓋?

base class 
fun of base 
derive class 
fun of derive 

爲什麼第二行是不是fun of derive

+3

閱讀材料:[「從不在建築或銷燬過程中調用虛擬函數]](http://www.artima.com/cppsource/nevercall.html)。 – 2010-12-10 02:10:49

回答

4

當你在基類的構造函數中調用fun(),派生類有尚未構造(在C++中,首先構造一個構造的父類),因此係統沒有Derived的實例,因此Derived::fun()的虛函數表中沒有條目。

這就是爲什麼調用在構造函數中的虛函數時,除非你明確要調用的,目前正在進行實例化對象的一部分或它的一個祖先組成部分的虛擬函數的實現一般都是皺着眉頭的原因。

2

因爲你寫這樣的...你的派生類的構造函數調用的作用:

- Base Class Constructor call 
    | 
    Call to **fun of Base Class** 
- Derived Class Constructor call 
    | 
    Call to **fun of the Derived Class** 

更多細節here

+0

即使在構造函數中,基類中的虛方法總是被具有相同簽名的派生方法重寫? – yoyo 2010-12-10 02:01:36