多态使用时,如果子类中有属性开辟到堆区,那么父类的指针在释放时无法调用到子类的析构代码
解决方式:将父类中的析构代码函数改为虚析构或者纯虚析构
可以解决父类指针释放子类对象
都需要有具体的函数实现
如果是纯虚析构,该类属于抽象类,无法实例化对象
虚析构语法:
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;
}