继承时的析构函数


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