继承时的析构函数

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




长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html
原文地址:https://www.cnblogs.com/judes/p/13237423.html