问题:
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
解决方式:
将父类的析构改为虚析构或纯虚析构
-
可以解决父类指针释放子类对象
-
都需要具体的实现函数
虚析构和纯虚析构的区别:
-
如果是纯虚析构,该类属于抽象类,无法实例化对象
虚析构语法
virtual ~类名(){}
纯虚析构语法:
virtual ~类名()=0;
类名::类名()
class Animal {
public:
virtual void speak() {
}
Animal() {
cout << "Animal构造" << endl;
}
virtual ~ Animal() {
cout << "Animal析构" << endl;
}
};
class Cat :public Animal {
public:
Cat(string name) {
cout << "Cat构造" << endl;
m_name =new string( name);
}
~Cat() {
cout << "Cat析构" << endl;
if (m_name != NULL) {
delete m_name;
m_name = NULL;
}
}
void speak() {
cout <<*m_name << "在说话" << endl;
}
string *m_name;
};
void test01(){
Animal *animal = new Cat("Tom");
animal->speak();
delete animal;
}
Animal *animal = new Cat("Tom");
父类Animal使用多态的方法让之类Cat在堆区开辟的一块空间,为了防止内存泄漏,要写一个父类的虚析构或纯虚析构,在能运行子类中的析构函数,释放子类在堆区开辟的空间。