虛析構函式

2021-06-16 07:20:50 字數 1322 閱讀 3327

析構函式最好都用virtual 。先解釋下析構函式和指標之間的互動。以及虛構函式的具體含義。

例如下面的**其中的someclass 是含有非virtual 析構函式的乙個類

someclass *p= new someclass;

...delete p;

為p呼叫delete時候會自動呼叫someclass類的析構函式,現在看看將析構函式極為virtual 的時候發生什麼東東。

描述析構函式和虛函式機制互動時候,最簡單的說法是:將所有的虛構函式都視為其相同的名稱,(即使他們並非真的同名)

假如derived類是base類的乙個派生類,並假定base類中的析構函式標記為virtual 現在分析以下**

base *pbase= new derived;

...delete pbase;

為pbase 呼叫delete 時候會呼叫乙個析構函式,由於base類中的析構函式標記為virtual 而且指向的物件屬於derived 型別,所用會呼叫derived的析構函式(它接著呼叫base類的析構函式)

如果base類中的析構函式沒有標記為virtual那麼只會呼叫base中的析構函式。

要注意的另一點是將析構函式標記為vitrual 後派生類中的所有析構函式都會自動成為virtual 不管是否用virtual 這種行為就好比所有的析構函式都具有相同的名稱。

現在解釋為什麼所有的析構函式都是virtual 的假定base類中有乙個指標型別的成員變數pb,base類的建構函式會建立由pb指向的乙個動態變數,而base類的析構函式會刪除pb指向的動態變數,另外假如base類中的析構函式沒有標記為virtual 並假定derived 類,(它從base派生)有乙個指標型別的成員變數pd,derived 類的建構函式會建立乙個有pd指向的動態變數,而derived類的析構函式會刪除pd指向的動態變數。

base *pbase= new derived;

...delete pbase;

由於基類中的析構函式沒有標記為virtual 所以只會呼叫base類的析構函式。這會將pb指向的動態變數占用的記憶體返還給自由儲存,(除非程式終止)。

另一方面,如果將基類中的base的析構函式標記為virtual 那麼為pbase 呼叫delete時會自動呼叫derived 類的析構函式(因為指向的物件是derived 型別)derived 類的析構函式會刪除pd指向的動態變數,再自動呼叫基類的base析構函式,後者會刪除pb指向的動態變數。

因此將基類的析構函式標記為virtual之後,所有的記憶體都能成功的由自由儲存來**。為了準備迎接這種情況,最好總將析構函式標記為virtual 。

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

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

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

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

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

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