多态使用时,如果子类中有属性开辟到堆区,那么父类的指针在释放时无法调用到子类的析构代码
解决方式:将父类中的析构代码函数改为虚析构或者纯虚析构
虚析构和纯虚析构共性:
可以解决父类指针释放子类对象
都需要有具体的函数实现
虚析构和纯虚析构的区别
如果是纯虚析构,该类属于抽象类,无法实例化对象
虚析构语法:
virtual ~类名(){}
纯虚析构语法:
virtual ~类名()=0;
类名::类名(){}
示例:
#include<iostream>
using namespace std;
class Animal
{
public://纯虚函数virtual void speak() = 0;Animal(){cout << "Animal构造函数的调用" << endl;}//利用虚析构可以解决 父类在释放子类对象时不干净的问题//virtual ~Animal()//{// cout << "Animal析构函数的调用" << endl;//}//纯虚析构 需要声明 也需要实现//有了纯虚析构之后,这个类也称为抽象类,无法实例化对象virtual ~Animal() = 0;
};
Animal::~Animal()
{cout << "纯虚析构函数的调用" << endl;
}class Cat:public Animal
{
public:virtual void speak(){cout <<*m_Name<< "小猫在说话" << endl;}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;}}string* m_Name;
};
void test01()
{Animal* animal = new Cat("longlong");animal->speak();delete animal;
}
int main()
{test01();system("pause");return 0;
}