虛析構函式

2021-06-28 19:55:41 字數 1523 閱讀 2538

還是一篇有關虛函式的文章,這次是解析虛析構函式的。先直接上**吧。

[cpp]view plain

copy

#include 

using

namespace

std;  

class

a    

class

b    

virtual

~b()   

}  class

c : 

public

b    

intmain()   

執行結果:若19行沒有virtual:a   b   c  ~a  ~b

若19行有virtual:    a   b   c  ~c  ~a  ~b

這個結果說明,如果類b被類c繼承,而且用父類的指標指向其子類物件(比如:b *bb = new c;)時,那麼父類b的析構函式必須是虛的,否則在delete bb的時候,只會呼叫父類b的析構函式,子類c的析構函式不會被呼叫。這樣會造成記憶體洩露。

建構函式的工作方式:先呼叫父類的建構函式,再呼叫派生類的建構函式。

析構函式的工作方式:先呼叫派生類的析構函式,再呼叫每乙個父類的析構函式。

如果層次中根類的析構函式是虛函式,則派生類的虛構函式也將是虛函式

,無論派生類顯式定義析構函式還是使用合成析構函式,派生類的析構函式都是虛函式。這樣就說明了下面的問題,因為b的析構函式是虛函式,那麼c的虛構函式也是虛函式,這樣,~b和~c都存在於c的虛表之中,在b *pb = new c;的時候,將c的虛表淺拷貝到了b類指標指向的區域,那麼在delete pb;的時候,自然會呼叫到

~c和~b。

從上面這張可以看出,在b *pb = new c;這一步時,c物件的虛函式表被淺拷貝到b物件的虛函式表。從而delete pb;的時候,呼叫了c的析構函式。

後來還遇到一種情況,如下:

[cpp]view plain

copy

class

ca  

;  class

cb:public

ca  

;  class

cc:public

cb  

;   主函式為:

[cpp]view plain

copy

intmain()  

的時候,輸出的結果如下:

ca constructor

cb constructor

cc constructor

這種情況是,沒有呼叫析構函式,直接把申請的記憶體給釋放了。

本文出自 「cesc

」 部落格,請務必保留此出處

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

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

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

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

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

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