先補下virtual是啥
虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類的版本。
先貼個**,再解釋
#include using在**尾部的注釋就是輸出。namespace
std;
class
base
; ~base()
};class a : public
base
~a()
};class
base1
;
virtual ~base1()
};class a1 : public
base1
~a1()
};int
main()
/*base construct
a construct
base destroy
********************==
base1 construct
a1 construct
a1 destroy
base1 destroy
*/
base的析構函式沒有virtual
base1的析構函式有virtual
base* p = new a
delete p
這個過程只呼叫了base的析構函式,沒有呼叫a的析構函式。
這樣在實際應用中會有不確定的後果,可能會memory leak
應該在a的析構函式中我們可能會銷毀一些其他的資源,而這裡並未呼叫。
所以要給base的析構函式以virtual屬性。
繼承基類析構函式一定要加上virtual
繼承時,要養成的乙個好習慣就是,基類析構函式中,加上virtual,為什麼要加上呢?看下未加virtual的 執行結果 include stdafx.h include include include include include using namespace std class ctask c...
C 類有繼承時,析構函式必須為虛函式
虛函式與多型一文中講了虛函式的用法和要點,但少講了一點,就是虛函式在析構中的用法,本文就是修復一bug的。c 類有繼承時,析構函式必須為虛函式。如果不是虛函式,則使用時可能存在內在洩漏的問題。假設我們有這樣一種繼承關係 如果我們以這種方式建立物件 subclass pobj new subclass...
C 繼承中的建構函式和析構函式
1 繼承中建構函式和析構函式呼叫順序 a 呼叫父類建構函式 b 呼叫其他成員的建構函式 c 呼叫子類建構函式 d 析構呼叫順序相反。include using namespace std class base public base cout base中的預設構造函式呼叫 2 子類預設呼叫父類的預設...