虚析构函数---特殊的析构函数
-
不正常的赋值操作会导致释放问题,引申出虚析构函数
-
存在非正常的赋值操作(用子类对象初始化父类指针),子类中有数据成员,数据成员做了内存申请,父类的析构函数一定要写成虚析构函数,这样就会调用子类的析构函数做内存的释放
-
子类的数据成员如果没有申请内存,就不存在内存泄漏问题
class parent
{
public:
//虚析构函数:用virtual修饰的父类析构函数,这样就会调用子类的析构函数
virtual ~parent()
{
cout << "父类析构" << endl;
}
void print() {}
protected:
};
class son :public parent //子类public继承父类
{
public:
void print()
{
}
~son()
{
cout << "子类析构" << endl;
}
};
int main()
{
//用子类对象初始化父类指针,父类需要虚析构函数做内存的释放
parent* p = new son;
p->print(); //调用print()
delete p; //释放p
return 0;
}
/*输出*/
子类析构
父类析构
/*没有virtual修饰的析构函数输出*/
父类析构/*存在内存泄漏问题,new的子类对象,但是没有释放子类对象 没有调用子类析构函数*/
小知识:
覆盖的效果,析构函数的底层都是同一个函数做内存的释放
构造函数不能被继承,不存在虚构造函数