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

2021-09-11 18:53:25 字數 776 閱讀 7632

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

囉囉嗦嗦我們直接看**:

#includeusing namespace std;

class a

~a()

};class b

~b()

};class c :public a, public b

~c()

};int main()

輸出:

因為基類析構函式沒有宣告為虛函式,所以在delete p的時候析構函式的執行順序是 c b a,但是a和b的析構函式不是虛函式,所以編譯器靜態繫結到基類,不會執行派生類的析構函式導致析構不完成。

#includeusing namespace std;

class a

virtual ~a()

};class b

~b()

};class c :public a, public b

~c()

};int main()

輸出:完全析構。所以存在派生類的時候將基類的析構函式宣告為虛函式很有必要

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

我們大家都知道,在c 中,當乙個物件銷毀時,析構函式是用來對類物件和物件成員進行釋放記憶體和做一些其他的cleanup操作。析構函式靠 符號來區分,出現在 析構函式名字的前面,當我們去定義乙個 虛析構函式時,你只需要簡單的的在 符號前面 加乙個 virtual標誌就可以了。為什麼需要將析構函式宣告為...

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

1 作用 在實現多型時,當用基類的指標操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。2 例項 include using namespace std class father father 1 非虛函式 private int mptr class son public father ...

析構函式宣告為虛函式

base pb inherit c inherit 是繼承 base的 pb c delete pb 時需要呼叫物件的析構函式,如果基類析構不是virtual型,會根據pb的定義型別呼叫相應類的析構函式,即呼叫即類析構,但如果你在派生類析構裡有記憶體釋放操作,那就會發生記憶體洩漏。假如基類析構是vi...