原因:
父类指针指向子类时,父类的析构函数无法释放子类在堆区创建的属性(后果:内存泄露)
纯虚析构的特点:
虽然纯虚函数不能有函数的实现,但是纯虚析构一定要有函数的实现。
语法强制父类中纯虚析构要有函数实现,因为父类函数中也可能存在在堆区开辟的数据。
纯虚析构存在的意义:
强制子类重写析构函数
#include<iostream>
#include<cstdio>
using namespace std;
class A{
public:
A(){
cout<<"A的构造函数"<<endl;
}
// // 虚析构
// virtual ~A(){
// cout<<"A的析构函数"<<endl;
// }
// 纯虚析构
virtual ~A() = 0;
// 纯虚函数
virtual void func() = 0;
};
A::~A(){
cout<<"A的纯虚析构函数"<<endl;
}
class B:public A{
public:
int *_b; // 堆区成员属性
public:
B(int b){
cout<<"B的构造函数"<<endl;
this->_b = new int(b); // 创建在堆区
}
~B(){
cout<<"B的析构函数"<<endl;
if(this->_b!=nullptr){
delete(this->_b);
this->_b = nullptr;
}
}
void func(){
cout<<*_b<<"B的func()"<<endl;
}
};
// 地址晚绑定 (在运行时确定函数地址)
void f(){
A *a = new B(10); // 向上转化 子类默认向父类转化
a->func();
delete(a);
}
int main(){
f();
return 0;
}