首先new是在系統堆中分配壹個永久的內存,內存的大小與B的尺寸相同。
然後調用B的構造函數構造B對象的實例。
最後將新構造的B實例的指針記錄到A *P中。
雖然P是A類型的指針,但是真實的實例還是B特征的,只是B是A的派生類,所以B也具有A的通用特征。
這裏用指針表示,壹般是為了調用壹些通用特征。並且不會對真實的B實例進行切割。如果使用類似B b;A a=b;那麽最終的a就已經對b產生了切割。具體以後學習就會慢慢知道了。
2、整體調用順序:
A、首先調用B的構造函數;
B、B的構造函數開始執行時,首先會執行A的構造函數,然後才執行B的構造函數的執行體。
B的構造函數是開始執行的入口,但是剛進入口後的第壹步是執行A的構造函數,然後才繼續B的構造函數實現語句。
C、析構函數由於是虛函數,所以delete時,會先執行B的析構函數,然後執行A的析構函數,最後結束。註意:如果析構函數全都不是虛函數,那麽並不會調用B的析構函數。
3、測試代碼:
class A
{
public:
A()
{
printf("This is A Constructor!\n");
}
virtual ~A()
{
printf("This is A Destructor!\n");
}
};
class B : public A
{
public:
B()
{
printf("This is B Constructor!\n");
}
virtual ~B()
{
printf("This is B Destructor!\n");
}
};
int main(int argc, char* argv[])
{
A *pa = new B;
delete pa;
return 0;
}
4、測試結果輸出:
This is A Constructor!
This is B Constructor!
This is B Destructor!
This is A Destructor!