虚析构和纯虚析构
2023-12-28 19:31:29
多态使用时,如果子类中有属性开辟到堆区,那么父类的指针在释放时无法调用到子类的析构代码
解决方式:将父类中的析构代码函数改为虚析构或者纯虚析构
虚析构和纯虚析构共性:
可以解决父类指针释放子类对象
都需要有具体的函数实现
虚析构和纯虚析构的区别
如果是纯虚析构,该类属于抽象类,无法实例化对象
虚析构语法:
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;
}
文章来源:https://blog.csdn.net/xms12_3/article/details/135276260
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!