環境:VS2010
代碼:
#include <iostream>
using namespace std;
class A{
public:
A() { q(); cout<<"A::A()"<<endl; }
virtual void q() { cout<<"A"<<endl; }
};
class B:public A{
public:
B() { q(); cout<<"B::B()"<<endl;}
void q() { cout<<"B"<<endl; }
};
int main(void){
A* p=new B;
p->q();
delete p;
return 0;
}
分析:
主函數裡構造B,應該調用基類構造函數,再調用自己的構造函數,這裡容易想明白,但是構造函數裡調用了q函數,q又是虛函數,這裡應不應該調用派生類的q函數呢?
觀察輸出結果:
可以看出,並沒有看到調用派生類的q虛函數。
這是為什麼?因為構造對象時是從基類開始,到派生類的組合類,最後才是自己。當調用基類的構造函數時,不可能調用派生類的虛函數,因為對象都沒有構造完全,怎麼能讓基類的指針指向派生類呢?所以是不會調用派生類的虛函數的。
總結:當基類構造函數調用虛函數時,不會調用派生類的虛函數