/*------虚析构和纯虚析构---------*/
#include<iostream>
using namespace std;
class Animal
{
public:
virtual void speak() = 0; //纯虚函数,抽象类
virtual ~Animal() //将抽象类的析构函数设为虚析构,才可以走子类的析构函数
//否则子类的析构函数不执行,无法释放子类堆区数据
{
cout << "Animal析构函数被执行" << endl;
}
/*或者将其设置为纯虚析构,并添加上具体的实现方式*/
/* virtual ~Animal() = 0
{
cout << "Animal析构函数被执行" << endl;
}*/
};
class cat :public Animal
{
public:
cat(string name)
{
m_name = new string(name); //创建堆区,分配内存,需要在析构函数中删除
}
void speak() //纯虚函数重写
{
cout << *m_name<<ends<<"小猫在说话" << endl;
}
~cat() //如果父类中的析构函数不设为虚析构或者纯虚析构,则子类析构函数无法被执行
{
if (m_name != nullptr)
{
delete m_name;
m_name = nullptr;
}
cout << "cat析构函数被执行" << endl;
};
string *m_name;
};
int main()
{
/*
小结:如果纯虚函数中,子类有堆空间需要释放,则抽象类父类,需要将
析构函数设为虚函数,或者纯虚函数,否则子类析构函数不会被执行。
*/
Animal* a = new cat("kalit");
a->speak();
if (a!=nullptr)
{
delete a;
a = nullptr;
}
return 0;
}
C++虚析构和纯虚析构
最新推荐文章于 2025-03-08 12:35:01 发布