不在構造和析構過程中調用虛函數

1.不能在構造過程中調用虛函數。

比如:在基類中有一個虛函數。

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.在構造期間,可以令派生類將必要的構造信息向上傳遞至基類構造函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章