建構函式和析構函式呼叫虛函式會發生什麼

2021-10-06 09:54:58 字數 858 閱讀 8520

寫這個部落格的原因是因為最近在面試的時候被問過好幾次這個問題,但是卻一直處於一種模稜兩可的狀態, 因此今天記錄一下這個問題的乙個理解已經**實驗的現象.

都知道虛函式是為了實現多型中的乙個動態繫結過程. 而在進入派生類的建構函式之前,會先呼叫基類的建構函式.

話不多說,先看**.

class base

base()

};class derived: public base

derived()

};int main()

執行結果為:

總結: 從語法上來說, 建構函式是可以呼叫虛函式的, 編譯並不會有問題(面試被問會不會出現編譯報錯), 但是這麼做起不到並起不到虛函式本身的動態繫結作用, 只會呼叫自身所在類的對應虛函式, 也就失去了這麼做的意義. 同時從結果上也看出了派生類物件構造前先呼叫基類構造.

從結果上看的話, 編譯通過且輸出了結果, 基類指標指向乙個派生類物件, 在析構的時候其仍然是處於乙個基類的狀態, 因此會呼叫基類的show()函式, 而派生類指標指向派生類物件, 其是乙個派生類因此會先呼叫派生類的析構函式,然後再呼叫基類的析構函式.

建構函式 析構函式 虛析構函式

說析構函式之前,先說下建構函式。建構函式用來完成對物件的一系列初始化操作,主要作用有 1.給建立的物件建立乙個識別符號 2.為物件資料成員開闢記憶體空間 3.完成物件資料成員的初始化 當並未顯示的定義建構函式時,會生成乙個預設的建構函式,預設建構函式不能完成物件資料成員的初始化,只能給物件建立一識別...

建構函式和析構函式中的虛函式呼叫

乙個類的虛函式在它自己的建構函式和析構函式中被呼叫的時候,它們就變成普通函式了,不 虛 了。也就是說不能在建構函式和析構函式中讓自己 多型 例如 class a 在這裡,無論如何都是a foo 被呼叫!a 同上 virtual void foo class b public a void bar 如...

建構函式 析構函式 虛函式

在類中,建構函式用於初始化物件及相關操作。建構函式是不能宣告為虛函式的,因為虛函式對應乙個virtual table 虛函式表 這個表的位址是儲存在物件的記憶體空間的。而在執行建構函式前,物件尚未完成建立,記憶體都沒有被分配,所以無法去查詢虛函式表,它不存在,因此也就無法得知該呼叫哪乙個函式了。析構...