還是一篇有關虛函式的文章,這次是解析虛析構函式的。先直接上**吧。
[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 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...