继承时的析构函数

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

posted @ 2020-07-05 01:23  朱小勇  阅读(892)  评论(0编辑  收藏  举报