【C++学习笔记】C++为什么基类要用虚析构

C++为什么基类要用虚析构

析构函数:C++中对象使用结束后应当释放其占用的空间。
虚函数:父类中采用虚函数,子类重写虚函数实现多态。

为什么析构函数要声明是virtual函数?

父类指针指向子类对象实现多态
当子类在堆区开辟空间时,虽然在子类的析构函数中可以实现内存释放,但由于是父类指针指向子类对象,父类指针在执行其析构函数时,并不会触发子类对象的析构函数,会导致内存泄漏的出现。

不采用虚析构函数:
#include<iostream>
#include<string>
using namespace std;

class animal
{
public:
	animal()
	{
		cout << "animal的构造函数" << endl;
	}
	//虚函数 
	virtual void speak() = 0;
	~animal()
	{
		cout << "animal的析构函数" << endl;
	}
};
class cat :public animal
{
public:
	cat(string name)
	{
		cout << "cat的构造函数" << endl;
		m_name = new string(name);//这个指针指向堆区数据
	}
	void speak()
	{
		cout << *m_name << " : 喵喵" << endl;
	}
	string* m_name;//小猫的名字指针,用来管理堆区数据
	~cat()
	{
		cout << "cat的析构函数" << endl;
		if (m_name != NULL)//释放堆区内存
		{
			delete m_name;
			m_name = NULL;
		}
	}
};
void test1()
{
	animal* a = new cat("Tom");
	a->speak();
	delete a;	
}
int main()
{
	test1();
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
可见,cat类的析构函数并未被调用。

采用虚析构函数:

将animal类的析构函数改为:

virtual ~animal()
	{
		cout << "animal的析构函数" << endl;
	}

运行结果为:
在这里插入图片描述
子类析构成功,内存释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值