假設A是一個接口類,有一個析構函數是~A;然后B類繼承並實現了了A,有一個析構函數~B。內存釋放有如下幾種情況:
1、A的析構函數是虛函數,父指針或子指針指向子對象
virtual ~A(){} A* a = new B;//或者B* a = new B;
delete a;
釋放順序是~B,~A。因為用到了多態,編譯器根據實際數據進行調用【即new B--->B】,故先調用~B,根據析構順序再調用~A
2、A的析構函數不是虛函數,父指針指向子對象
~A(){} A* a = new B; delete a;
釋放順序是~A,不沒有~B。因為沒用到多態,編譯器根據數據類型【即A】進行釋放,故只調用~A
3、A的析構函數不是虛函數,子指針指向子對象
~A(){} B* a = new B; delete a;
釋放順序是~B,~A。因為用到了多態,編譯器根據實際數據進行調用【即new B--->B】,故先調用~B,根據析構順序再調用~A