比如:在基類中有一個虛函數。
class Transaction{
public:
Transaction();
virtual void logTransaction() const = 0; //虛的成員函數。
};
Transaction::Transaction() //基類構造函數實現
{
logTransaction();
}
下面有兩個派生類繼承它:
class BuyTransaction:public Transaction{
public:
virtual void logTransaction() const;
}
class SellTransaction:public Transaction{
public:
virtual void logTransaction() const;
}
那麼當我們創建一個派生類對象時,比如:
BuyTransaction b;
這個時候就會有一個問題,創建派生類對象,首先是基類的構造函數被調用。然後纔是派生類的構造函數被調用。但是在這個例子中,基類Transaction的構造函數中會調用虛函數logTransaction。這個時候是在構造基類的過程中,
此時,派生類的成員變量尚未初始化,如果在基類構造構成中虛函數下降至派生類階層,那麼在派生類中必然要用到局部成員變量,而這個時候這是c++所不允許的。所以在基類構造期間,虛函數絕不會下降到派生類階層。
2.在析構過程中也不能調用虛函數
在析構的時候,會先調用派生類的析構函數,然後再調用基類的析構函數。一旦派生類的析構函數開始執行,對象內的派生類成員變量便呈現未定義值。
所以在派生類的析構函數調用完成之後,會進入基類的析構函數,此時就變爲基類的對象。當析構函數中調用了虛函數時,編譯器會無法連接,找不到該虛函數的實現代碼。
3.如果基類中有多個構造函數,並且每個構造函數都需執行某些相同工作,那麼可以將共同的初始化代碼放進一個初始化函數裏,如init內,通常這個init放在private下。
4.在構造期間,可以令派生類將必要的構造信息向上傳遞至基類構造函數。