1.如果子类中有属性创建在堆区,那么多态情况下,不会调用子类的析构代码,导致内存泄露。
2.解决方案:利用虚函数或者纯虚析构
3.虚析构 在析构前加关键字virtual就可以了
4.纯虚析构 virtual 函数名() = 0;
5.纯虚析构类内声明 类外必须实现
6.如果一个类中纯虚析构函数,那么这个类也属于抽象类
C++案例代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string.h>
using namespace std;
class Animal {
public:
Animal() {
cout << "Animal的构造函数的调用" << endl;
}
//虚析构 解决的问题是 当子类中有堆区内容,释放时候会导致释放不干净,内存泄漏
//virtual ~Animal() {
//cout << "Animal的析构函数的调用" << endl;
//}
//纯虚析构
//只有声明没有实现会出现错误
//有声明 也必须有实现
//如果一个类中有了纯虚构函数后,那么这个类也属于抽象类
virtual ~Animal() = 0;
virtual void speak() {
cout << "动物在说话" << endl;
}
};
Animal::~Animal() {
cout << "Animal的纯析构函数调用" << endl;
}
class Cat :public Animal {
public:
Cat(char *name) {
cout << "Cat的构造函数的调用" << endl;
this->m_Name = new char[strlen(name) + 1];
strcpy(this->m_Name, name);
}
void speak() {
cout<< m_Name << "小猫在说话" << endl;
}
~Cat() {
if (this->m_Name != NULL) {
cout << "Cat的析构函数的调用" << endl;
delete[] this->m_Name;
this->m_Name = NULL;
}
}
char *m_Name; //猫的姓名
};
void test01() {
//Animal a; //error:如果一个类中纯虚析构函数,那么这个类也属于抽象类
Animal *animal = new Cat("Tom");
animal->speak();
delete animal;
}
int main() {
test01();
system("pause");
return 0;
}