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

2021-10-07 18:54:26 字數 1236 閱讀 6024

我們知道析構函式是在物件生命週期結束時自動被呼叫,用來做一些清理工作(如釋放控制代碼,釋放堆記憶體等),防止出現記憶體洩漏。

那怎麼還有虛析構函式呢?

使用虛析構函式的類一般是要作為基類,被其他類繼承。通過把基類的析構函式宣告為虛函式,就可以通過父類指標來釋放子類物件,從而完成子類的一些清理工作,防止出現記憶體洩漏。

案例1:基類析構函式為非虛函式

class parent

;class child : public parent

;

#include "test.h"

#include using namespace std;

parent::parent()

parent::~parent()

}child::child()

#include "test.h"

void func(parent *parent)

int main(int argc, char *ar**)

執行結果:

parent::~parent() was called.

結論:父類析構函式為非虛函式時,通過父類指標來釋放子類物件時,只會呼叫父類的析構函式,而不會呼叫子類的析構函式,造成了子類的記憶體洩漏。所以,應該將父類的析構函式宣告為虛函式。

案例2:父類的析構函式為虛函式

其他檔案不用動,只需修改test.h,將父類的析構函式宣告為虛函式。

class parent

;class child : public parent

;

執行結果:

child::~child() was called.

parent::~parent() was called.

結論:只有將父類的析構函式宣告為虛析構函式時,通過父類指標釋放子類物件時,會先呼叫子類的析構函式,然後呼叫父類的析構函式,不存在記憶體洩漏問題。

通過上面的虛析構函式知道,c++基類的析構函式最好宣告為虛機構函式,那什麼時候宣告為純虛析構函式呢?

我們知道,帶有純虛函式的類為抽象類,不能被例項化,只能被子類繼承,所以當我們設計乙個基類為抽象類時,可以把析構函式宣告為純虛析構函式,這樣基類就是抽象類了。

注意:純虛析構函式也要有函式體,用來做一些基類的清理工作,防止基類出現記憶體洩漏。

C 虛函式,純虛函式,虛析構和純虛析構

c 虛函式 定義為虛函式是為了允許用基類的指標來呼叫子類的這個函式,是需要具體實現的 virtual void funtion1 c 純虛函式 一 定義 純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 vir...

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

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

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

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