1、首先需要了解父類和子類的記憶體分布
如下圖,B類(子)繼承A類(父):
2、其次就是delete删除對象原理
delete就是依據指針指向的記憶體位址,如何删除記憶體資料,具體删除多少呢?那就看指針類型了。
如果指針類型為A*,那就删除A類大小的記憶體。
3、按1、和2中的内容,那麼冒出一個問題!
看如下代碼:
A* a = new B(); //按上圖方式,B繼承于A
delete a;
父類指針指向子類對象的情況會怎麼删除?
依據上面内容推測,B類中的A對象段的記憶體将會被删除,而剩餘的B自己的資料将不會,這樣不是造成記憶體洩漏了!!!貌似好像是這樣。
4、針對這個問題有什麼解決方法?
将父類析構函數設定為虛函數,也就是函數前面加“virtual”即可解決此問題。
這樣的情況下,delete a會先執行子類的析構函數後,再執行父類的析構函數。
(1) 父類析構函數不虛化,運作情況如下:
A();
B();
~A();
(2) 父類析構函數設為虛函數,運作情況如下:
A();
B();
~B(); //!!! 不同點 !!!
~A();