C 析構函式的呼叫順序

2022-06-16 15:45:09 字數 907 閱讀 7308

如果指標指向基類,但是指標在執行時指向派生類,則該基類必須具有虛擬析構函式,以便破壞派生類。如果沒有虛擬析構函式,則只會執行基類的析構函式。

比如:

base*baseptr;

baseptr = new derived(1);

如果沒有新增virtual,也就是沒有虛擬析構函式,看下面**示例:

#include using

namespace

std;

class

base

~base()

};class derived : public

base

~derived()

};int

main()

則只會呼叫基類的析構函式

結果:

base contruction

derived contruction

base deconstruction

在新增virtual之後,就會先用派生類的析構函式,再呼叫基類的析構函式

這樣新增:

virtual ~base()

結果:

base contruction

derived contruction

derived deconstruction

base deconstruction

最後再提一下,如果指標是派生類宣告的,並且是指向派生類的,那麼呼叫順序是基類構造->派生類構造->派生類析構->基類析構 

如果指標是基類宣告,並且指向基類的,那麼呼叫順序是基類構造->基類析構

一些有用的blog:  understanding warning c4265: class has virtual functions

析構函式呼叫順序

設已經有a,b,c,d4個類的定義,程式中a,b,c,d析構函式呼叫順序為?c c voidmain 這道題主要考察的知識點是 全域性變數,靜態區域性變數,區域性變數空間的堆分配和棧分配 解題思路 其中全域性變數和靜態區域性變數時從靜態儲存區中劃分的空間 未初始化為bss,已初始化為資料段 二者的區...

析構函式的呼叫順序

析構函式做最後的 清場工作 一般當派生類物件從記憶體中撤銷時,先呼叫派生類的析構函式,再呼叫基類析構函式 但,若用new建立了臨時物件,在用delete撤銷物件是,系統會只執行基類的析構函式,而不執行派生類的析構函式。如果將基類的析構函式宣告為虛函式,由基類所有派生類的析構函式自動成為虛函式 即使析...

析構函式的呼叫順序

如果是多個物件,呼叫建構函式的次序與呼叫析構函式的次序相反 對於不同作用域和儲存類別的物件,建構函式he析構函式的呼叫順序 全域性物件 不同作用域和儲存類別的物件建構函式和析構函式的呼叫順序 在寫這個 時遇到了乙個問題,幾個警告 我使用的編譯器是visual studio 2019 出現了乙個錯誤 ...