C 不在建構函式和析構函式中呼叫虛函式

2021-10-06 08:37:59 字數 760 閱讀 6976

首先在建構函式或者是在析構函式中是可以呼叫虛函式的。但是我們最好不要這樣做。

一、不在建構函式中呼叫虛函式

當我們在建構函式中呼叫虛函式時,一定呼叫的是基類的虛函式,即使此時你定義的是乙個派生類的物件。

原因一:

在建立派生類物件時,一定首先呼叫的基類的建構函式,其次在呼叫的是派生類建構函式。問題就在於,當程式執行到基類的建構函式時,因為還沒有呼叫到派生類的建構函式,所以此時派生類的成員還處於未初始化的階段,而在虛函式中幾乎可以肯定它會對派生類的成員進行操作,而此時派生類中的成員還沒有初始化,那麼這在c++中是絕對不可以的,所以它不能在基類中呼叫派生類的建構函式。

原因二:

在派生類物件的建立中,當他執行到基類的建構函式時,此時c++認為它並不是乙個派生類物件,而是把它當做乙個基類的物件,而虛函式又是在執行期間動態進行型別檢查的,所以此時虛函式檢查它為基類型別,所以它呼叫的就是基類的虛函式。

二、不在析構函式中呼叫虛函式

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

在基類的析構函式中呼叫的虛函式一定是基類的,不能呼叫派生類的,因為此時派生類的成員已經被銷毀,所以無法呼叫。

三、總結

在基類的建構函式中,只能呼叫基類的虛函式

在派生類的建構函式中既可以呼叫基類的也可以呼叫派生類的

在基類的析構函式中,只能呼叫基類的虛函式

在派生類的析構中,既可以呼叫基類的,也可以呼叫派生類的

不在構造和析構過程中呼叫虛函式

1.不能在構造過程中呼叫虛函式。比如 在基類中有乙個虛函式。class transaction transaction transaction 基類建構函式實現 下面有兩個派生類繼承它 class buytransaction public transaction class selltransac...

C 顯示呼叫建構函式和析構函式

建構函式和析構函式可不可以顯示呼叫 class a a void main 此時的輸出結果是 a constructor a constructor 顯示呼叫建構函式的結果。a destrucotr 顯示呼叫析構函式的結果,此時物件並沒有銷毀。a destructor 物件銷毀時自動呼叫析構函式。總...

C 顯示呼叫建構函式和析構函式

類在new的時候其實做了兩件事情 1 呼叫malloc分配所需的記憶體 實際上是呼叫operator new 2 呼叫建構函式 類在delete的時候其實也做了兩件事 1 呼叫析構函式 2 呼叫free釋放記憶體 實際上是呼叫operator delete 直接通過 類名 建構函式或析構函式clas...