#include<iostream>
#include<string>
using namespace std;
class Father {
public:
Father(const char* addr = "中国") {
cout << "执行了Father构造函数" << endl;
int len = strlen(addr) + 1;
this->addr = new char[len];
strcpy_s(this->addr, len, addr);
}
~Father(){
cout << "执行了Father析构函数" << endl;
if (addr)
{
delete addr;
addr = NULL;
}
}
private:
char* addr;
};
class Son :public Father {
public:
Son(const char* game = "吃鸡", const char* addr = "中国") :Father()
{
cout << "执行了Son的构造函数" << endl;
int len = strlen(game) + 1;
this->game = new char[len];
strcpy_s(this->game, len, game);
}
~Son(){
cout << "执行了Son的析构函数" << endl;
if (game)
{
delete game;
game = NULL;
}
}
private:
char* game;
};
int main(void)
{
Father* father;
father = new Son();
delete father;
system("pause");
return 0;
}
执行完上述代码后,结果为:没有调用Son类的析构函数。
解决方法:把Father类的析构函数定义为virtual函数
修改如下:
再次执行结果:
原理:如果对 Father类的指针使用delete操作时,就会对该指针使用“动态析构”。如果这个指针指向的是子类对象,那么会先调用该子类的析构函数,再调用自己类的析构函数
所以在开发的时候,为了防止内存泄漏,可以在基类析构函数上添加virtual关键字,使基类析构函数为虚函数。
当使用delete释放基类指针时,会实现动态的析构。
如果基类指针指向的是基类对象,那么只调用基类的析构函数
如果基类指针指向的是子类对象,那么会先调用子类的析构函数,再调用父类的析构函数。