问题的引出
当delete后面跟的是父类的指针,只会执行父类的析构函数,
当delete后面跟的是子类的指针,则父类和子类的析构函数都会被执行。
想通过父类指针销毁子类对象,将不会执行子类的析构函数,所以会产生内存泄漏。
虚析构函数的作用
通过父类的析构函数把子类的所有析构函数执行一遍,释放所有子类的资源。
注意
构造函数是不能为虚函数
静态函数不能为虚函数
内联函数不能是虚函数
析构函数可以为虚函数
虚析构函数实例
#include <iostream>
using namespace std;
class A
{
public:
A() { cout<<"A"<<endl;}
virtual ~A() { cout<<"~A"<<endl; } //基类的析构函数使用虚函数即可
};
class B : public A
{
public:
B() { cout<<"B"<<endl; }
~B() { cout<<"~B"<<endl; }
};
class C : public B
{
public:
C() { cout<<"C"<<endl; }
~C() { cout<<"~C"<<endl; }
};
void del(A * obj)
{
delete obj;
}
int main()
{
C * c1 = new C; //这里用new使用的堆空间 不会自动被清理需要delete来清理
del(c1); //这里会把父类子类资源全部释放
return 0;
}
delete子类指针也会释放父类的空间,使得内存不泄露。