参考
基类指针指向派生类对象,在删除指针时,会调用派生类的析构函数,派生类的析构函数会自动调用基类的析构函数,这样整个派生类的对象会被完全释放。
如果基类的析构函数不被声明为虚函数,在删除基类指针时,只会调用基类的析构函数,不会调用派生类的析构函数,造成内存泄露。
下面举例说明
#include "stdafx.h"
#include <iostream>
using namespace std;
class parent
{
public:
parent()
{
cout << "parent construction" << endl;
}
~parent()
{
cout << "parent destruction" << endl;
}
};
class son :public parent
{
public:
son()
{
cout << "son construction" << endl;
}
~son()
{
cout << "son destruction" << endl;
}
};
int main()
{
parent *p= new son();
delete p;
p = NULL;
return 0;
}
//输出结果:
//parent construction
//son construction
//parent destruction
上面只调用了基类的析构函数。因为没有将基类的析构函数声明为虚函数。下面将基类析构函数声明为虚函数:
// myvector.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class parent
{
public:
parent()
{
cout << "parent construction" << endl;
}
virtual ~parent()
{
cout << "parent destruction" << endl;
}
};
class son :public parent
{
public:
son()
{
cout << "son construction" << endl;
}
~son()
{
cout << "son destruction" << endl;
}
};
int main()
{
parent *p= new son();
delete p;
p = NULL;
return 0;
}
//输出结果
parent construction
son construction
son destruction
parent destruction