C 為什麼要將析構函式設為虛函式

2021-10-19 12:23:54 字數 1303 閱讀 7226

首先我們知道虛函式是實現執行期的多型的。

根據型別相容原則,在需要基類指標的地方,都可以用派生類的指標去代替。

如下**,就實現了多型。

#include

using namespace std;

class a~a

()virtual void

fun()}

;class b:public a~b

()virtual void

fun()}

;int

main()

輸出:

其實,上面**是存在記憶體洩漏的。

我們把類a和類b的析構函式加上輸出看看

#include

using namespace std;

class a~a

()virtual void

fun()}

;class b:public a~b

()virtual void

fun()}

;int

main()

輸出:

可以發現testa沒有問題。

但是testb只有類a部分被析構了,而類b還沒有析構,這裡存在了記憶體洩漏

那麼將析構函式定義為虛函式後呢

#include

using namespace std;

class a

virtual ~a(

) virtual void

fun()}

;class b:public a

virtual ~b(

) virtual void

fun()}

;int

main()

輸出:

這樣就沒有問題了

所以,將析構函式設為虛函式,是為了防止記憶體洩漏。

如果存在用基類指標指向派生類物件,這樣子可以使得基類和派生類的析構函式都被呼叫,不會造成記憶體洩漏。如果不把析構函式定義為虛函式,那麼只會呼叫基類的析構函式。

為什麼要將類的析構函式宣告為虛函式?

我們知道在類的繼承中,建構函式的執行順序是先構造基類然後再構造派生類,析構函式則相反,是先析構派生類再析構基類。我們也知道宣告父類的指標指向派生類,編譯器會預設實施靜態繫結,不能呼叫派生類重寫的函式,所以才需要虛函式。虛函式是通過虛函式表實現,在執行時進行動態繫結,可以呼叫在派生類重寫的函式。那麼如...

C 析構函式為什麼要為虛函式

1.為什麼基類的析構函式是虛函式?在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。下面 網路 源位址 a.第一段 includeusing namespace std class clxbase clxbase void dosomething class clxd...

C 析構函式為什麼要為虛函式

注 本文內容 於zhice163博文,感謝作者的整理。1.為什麼基類的析構函式是虛函式?在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。下面 網路 源位址 a.第一段 includeusing namespace std class clxbase clxbase ...