一、基类析构函数为虚函数
#include <iostream>
using namespace std;
class Point
{
public:
Point(){
cout << "Point()" << endl;
}
virtual ~Point(){
cout << "~Point()" << endl;
}
};
class Point3d : public Point
{
public:
Point3d(){
cout << "Point3d()" << endl;
}
~Point3d(){
cout << "~Point3d()" << endl;
}
};
int main()
{
Point *p = new Point;
delete p;
cout << "-------------------" << endl;
Point *p3d = new Point3d;
delete p3d;
cout << "-------------------" << endl;
Point3d *ps = new Point3d;
delete ps;
cout << "-------------------" << endl;
Point *psa = new Point3d[2];
delete psa;
cout << "-------------------" << endl;
Point *psb = new Point3d[2];
delete []psb;
cout << "-------------------" << endl;
return 0;
}
执行结果:
上面代码的执行结果均符合我们正常的多态需要。
二、基类析构函数不是虚函数
代码为去掉上面代码中基类析构函数中前的 virtual,执行结果为:
这次,我们发现几个由基类指针指向的子类对象并没有正确调用析构函数,释放内存。这说明,delete 释放对象内存的时候,需要注意两个方面的问题:
1、如果基类有虚拟析构函数,则可以直接通过基类指针释放子类的内存;
2、如果基类没有虚拟析构函数,则需要将指向子类对象的指针强转为子类类型后,传递给delete;
3、在继承体系中,我们的析构函数只需管理本类新引入的动态内存,而不需要关心父类中的内存管理;