在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;
}
運行結果: