- 虚析构函数的作用:
析构函数是可以声明为虚函数的,如果基类指针指向一个new生成的派生类对象,通过delete作用于基类指针删除派生类对象时,有以下两种情况:- 如果基类析构函数不为虚析构函数,则只会调用基类的析构函数,而派生类的析构函数不会被调用。因此派生类对象中派生的那部分内存无法析构释放。
- 如果基类析构函数为虚析构函数,则释放基类指针的时候会调用基类和派生类中的所有析构函数,派生类对象中所有的内存空间都将被释放,包括继承类的部分。
所以C++中的析构函数通常是虚析构函数。
虚析构函数的声明语法:
virtual ~类名();
示例程序:
#include <iostream>
#include <stdlib.h>
#include <memory>
using namespace std;
class Person
{
public:
Person()
{
cout << "我是基类构造函数" << endl;
}
virtual ~Person()
{
cout << "我是基类析构函数" << endl;
}
void Display()
{
cout << "我是基类" << endl;
}
};
class Student : public Person
{
public:
Student()
{
cout << "我是派生类构造函数" << endl;
}
~Student()
{
cout << "我是派生类析构函数" << endl;
}
void Display() {
cout << "我是派生类" << endl;
}
};
int main()
{
Person *p = new Student();
p->Display();
delete p;
system("pause");
return 0;
}
运行结果:
我是基类构造函数
我是派生类构造函数
我是基类
我是派生类析构函数
我是基类析构函数
如果Person类中的析构函数前把virtual关键字去掉,则运行结果为:
我是基类构造函数
我是派生类构造函数
我是基类
我是基类析构函数
总结:当基类的析构函数不是虚析构函数时 ,使用delete释放对象时只释放基类没有释放派生类;