一個類對象,當生命周期結束時,該對象會調用自身的析構函數。
一個類的指針,當使用delete函數來刪除該指針時,會調用該指針當前類型的析構函數。
比如:
classB* pClass = (classB*)new classA;
delete pClass;
盡管該指針實際上是classA*類型,但將其轉換為classB*類型,那么delete時,調用的是classB的析構函數。
對於某些特殊類型,如void,int等,本身沒有析構函數,所以若將一個類指針強轉為void*,int*等,則delete時,不會調用析構函數。
實際上,一個類的自然釋放過程,是先執行析構函數,再逐個釋放成員變量。 設classA有成員變量classAE,classB有成員變量classBE,則:
classB* pClass = (classB*)new classA;
delete pClass;
會發現,先執行classB的析構函數,再執行classBE的析構函數。但實際上由於並沒有classBE的存在,故也就不執行classBE的析構函數。若內部沒有涉及嵌套的指針,那么這里並不會報錯。
故delete一個指針時,務必保證該指針的當前類型就是其定義的類型。
另外,子類自然釋放時,會先調用自身析構函數,再調用父類析構函數。
設以下操作均不涉及內部指針且沒有報錯:
① 父類指針轉為子類指針,並刪除:會先執行子類析構函數,再執行父類析構函數
② 子類指針轉為父類指針,並刪除:會執行父類析構函數,子類析構函數不會得到調用
所以,析構函數最好定義為Virtual。