C++ 不在構造函數和析構函數中調用虛函數

首先在構造函數或者是在析構函數中是可以調用虛函數的。但是我們最好不要這樣做。

一、不在構造函數中調用虛函數

當我們在構造函數中調用虛函數時,一定調用的是基類的虛函數,即使此時你定義的是一個派生類的對象。
原因一:
在創建派生類對象時,一定首先調用的基類的構造函數,其次在調用的是派生類構造函數。問題就在於,當程序執行到基類的構造函數時,因爲還沒有調用到派生類的構造函數,所以此時派生類的成員還處於未初始化的階段,而在虛函數中幾乎可以肯定它會對派生類的成員進行操作,而此時派生類中的成員還沒有初始化,那麼這在C++中是絕對不可以的,所以它不能在基類中調用派生類的構造函數。
原因二:
在派生類對象的創建中,當他執行到基類的構造函數時,此時C++認爲它並不是一個派生類對象,而是把它當做一個基類的對象,而虛函數又是在運行期間動態進行類型檢查的,所以此時虛函數檢查它爲基類類型,所以它調用的就是基類的虛函數。

二、不在析構函數中調用虛函數

在派生類中的析構函數中調用虛函數時,會優先調用派生類中的虛函數,如果派生類中沒有對虛函數進行重定義,那麼它會調用基類的虛函數。

在基類的析構函數中調用的虛函數一定是基類的,不能調用派生類的,因爲此時派生類的成員已經被銷燬,所以無法調用。

三、總結

在基類的構造函數中,只能調用基類的虛函數
在派生類的構造函數中既可以調用基類的也可以調用派生類的
在基類的析構函數中,只能調用基類的虛函數
在派生類的析構中,既可以調用基類的,也可以調用派生類的

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