虛析構函式

2021-06-16 22:49:53 字數 1126 閱讀 1521

析構函式的作用是在物件撤銷之前做必要的「清理現場」的工作。

當派生類的物件從記憶體中撤銷時一般先呼叫派生類的析構函式,然後再呼叫基類的析構函式。但是,如果用new運算子建立了臨時物件,若基類中有析構函式,並且定義了乙個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生乙個情況:系統會只執行基類的析構函式,而不執行派生類的析構函式。

例12.3 基類中有非虛析構函式時的執**況。

為簡化程式,只列出最必要的部分。

#include

using namespace std;

class point//定義基類point類

//point類建構函式

~point();

但是,在某些情況下,我們卻需要定義乙個純虛成員函式,而不僅僅是宣告它。最常見的例子是純虛析構函式。在宣告純虛析構函式時,不要忘了同時還要定義它。

class file //abstract class ;

file::~file() {} //definition of dtor

為什麼說定義純虛析構函式是非常重要的

派生類的析構函式會自動呼叫其基類的析構函式。這個過程是遞迴的,最終,抽象類的純虛析構函式也會被呼叫。

如果純虛析構函式只被宣告而沒有定義,那麼就會造成執行時(runtime)崩潰。(在很多情況下,這個錯誤會出現在編譯期,但誰也不擔保一定會是這樣。)純虛析構函式的啞元實現(dummy implementation,即空實現)能夠保證這樣的**的安全性。

class diskfile : public file ;

file * pf = new diskfile;

//. . .

delete pf; //ok, ultimately invokes file::~file()

在某些情況下定義其它純虛成員函式可能也是非常有用的(比如說在除錯應用程式以及記錄應用程式的日誌時)。例如,在乙個不應該被呼叫,但是由於乙個缺陷而被呼叫的基類中,如果有乙個純虛成員函式,那麼我們可以為它提供乙個定義。

class abstract ;

int abstract::func() {

std::cerr<<"got called from thread " << thread_id<<

"at: "<

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

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

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

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

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

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