c 中,delete是如何呼叫虛析構函式的?

時間 2021-06-02 05:59:02

1樓:Pluto Hades

正常情況下,基類的構造和析構是不會被派生類覆蓋的。這也很好記,因為它們不同名嘛

正常new派生類指標,會先呼叫基類構造再呼叫派生類構造。

正常delete派生類指標,和構造相反,先呼叫派生類析構,再呼叫基類析構。

2樓:Bunny.Lann

虛成員函式和虛析構函式肯定都是呼叫D的,只不過因為派生類是有基類部分的,析構派生類肯定也會把基類部分析構(基類部分最先被構造,最後被析構),析構派生類的基類部分的時候呼叫了~B()

3樓:月夜飛貓

「這裡虛析構函式和虛成員函式有什麼區別嗎?」 有區別「delete操作符對析構函式的呼叫有特殊處理嗎?」 你可以認為是,但編譯器未必真是如此實現。

普通虛成員函式:只會呼叫繼承類

虛析構函式:會呼叫繼承類的析構函式,再呼叫基類的析構函式。編譯器會幫你搞定,不需要自己手動呼叫基類的析構函式。

只要子類的析構函式被呼叫,基類的析構函式也會自動被呼叫,在delete的時候如此,在變數離開當前scope的時候也是如此。

4樓:Kouei

首先,虛函式表是不會被「處理」掉的,因為虛表是乙個類的所有例項所共有的。會被處理掉的頂多是指向虛表的指標。其次,析構的順序應該與構造的順序相反,所以~D只是析構了子類所獨有的部分,父類的析構還得靠~B。

C 多型的delete呼叫的是父類析構函式,那麼子類物件的記憶體釋放了嗎?

蘇秦 嘴巴選手。申請堆空間的時候會額外記錄本次申請的空間大小,通過類似 prepend 乙個 size t 的形式。所以 delete base 需要滿足,編譯器通過 base 獲取到的記憶體指標和通過 derived 獲取到的記憶體指標相同。如果編譯器在獲取記憶體指標時和析構函式不相關,那麼就會有...

C 在構造 析構函式中呼叫虛函式時,可以理解為是靜態繫結的嗎?

這個是未定義行為。我說一下vs下是怎麼做的。vs下的類的首位址的內容為虛表指標,佔4個或者8個位元組,取決於是32位還是64位程式。在基類初始化時,虛表指標指向基類虛表,子類初始化時,將其改寫為子類虛表位址。因此在基類中呼叫虛方法一定是呼叫了基類的虛函式。析構函式中也一樣,只不過虛表指標的改寫順序是...

編譯原理中棧幀是如何直接呼叫暫存器實現儲存臨時變數?

劉生 臨時變數還是區域性變數?函式裡的區域性變數包括引數都是直接放到棧裡的。有兩個暫存器sp bp是用來維護棧結構的 不知道你說的臨時變數指什麼? CNife 題主對棧幀和暫存器的功能有一些誤解。不嚴謹地說,不是棧幀 呼叫 暫存器,而是暫存器 讀寫 棧幀。如果你接觸過組合語言,就會發現所有彙編指令都...