首先,我們必須知道,虛析構函數是有其本身的目的,所以正常情況下,我們不應該聲明虛析構函數。
構造函數和析構函數是一個互逆過程,但是他們并不是成軸對稱的過程,而是類似中心對稱的過程,你可以想象成輸入和輸出的關系。
對象被創建時,從父類的構造函數開始一直到子類的構造函數為止,他的發起點是子類的構造函數(發起點很重要,如果不理解這個,就能很好理解虛析構函數的作用)
對象被釋放是,從子類的析構函數開始一直到父類的析構函數為止,他的發起點是子類的析構函數。
如果對象的析構函數沒有定義成虛的,他的執行過程和上述的一致,但是,如果定義成虛的,那么他的發起點是這個對象實際的子類析構函數,這個不好描述,我們給兩個例子。
沒有定義虛析構函數的源碼
輸出
從上圖可知,我們定義的類B的析構函數并沒有執行,這就有可能造成內存泄漏。再看一個例子:
定義了虛析構函數
輸出
從例子可以看出,當我們定義了虛析構函數,那么類B的析構函數也會被執行。
從上面的對比測試可知,虛析構函數可以讓對象實現完全的釋放,但是,如果沒有必要定義虛析構函數,我們最好不要定義虛析構函數,因為功能的提升,會帶來額外的開銷,這是顯而易見的道理!