C++構造函數和析構函數中千萬別去碰虛函數

在C++的構造函數和析構函數中,千萬別去調用類中的虛函數,因爲此刻虛函數的虛表指針還沒有在內存中安置妥當,是無法被調用的。如果你一定要冒天下之大不韙的話,那麼你調用到的函數將是一個普通函數,而不是虛函數,不具有多態等特性。也就是說,此刻你明明是要調用派生類的A函數,但實際的結果卻是調用到了基類的A函數。

也就是說,在構造函數和析構函數中,虛函數將退化爲普通函數。代碼示例如下:

class CBaseObject
{
public:
	CBaseObject() 
	{
		_DoIt();
	}

	void DoIt()
	{
		_DoIt();
	}

protected:
	virtual void _DoIt()
	{
		cout<<"Base do it!"<<endl;
	}
};

class CDerivedObject : public CBaseObject
{
protected:
	virtual void _DoIt()
	{
		cout<<"Derived do it!"<<endl;
	}
};


int main()
{
	CDerivedObject derivedObj;
	derivedObj.DoIt();

	return 0;
}

運行結果:


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