繼承時的析構函數


假設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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM