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