虛析構函式

2021-09-11 22:58:23 字數 782 閱讀 5252

有這樣一種場景:

class a

~a() };

class b : public a

~b() };

class c : public b

~c()

};

我們定義了三個類,b繼承a,c繼承b

void todelete(a *a)

int main()

執行結果:

可以看到,我a、b、c的建構函式都執行了,這很正常,但是析構時,只有a的析構函式被執行了,這了並沒有發生多型行為,這就造成了我們new了三塊記憶體但只刪除了一塊,造成記憶體洩露,這就要用到虛析構函式

我們為類的析構函式加上virtual關鍵字

class a

virtual ~a() };

class b : public a

virtual ~b() };

class c : public b

virtual ~c()

};

執行結果:

解決!*這樣我們就可以實現通過父類的指標,釋放所有的子類資源,把所有的子類物件的析構函式都執行一遍

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...