C++析构函数定义为virtual虚函数,有什么作用?

C++析构函数定义为virtual虚函数,有什么作用?

简介:析构函数定义为virtual虚函数,有什么作用?

代码讲解

简单的说,C++中基类采用virtual虚析构函数是为了防止内存泄漏,如果派生类中申请了内存空间,并在析构函数中对这些内存空间进行了释放。

如果这个时候基类中采取的是非虚构函数,那么当删除基类指针的死后,指向派生类对象的时候就不会发生动态绑定,导致的结果就是,调用基类的析构函数,而不会调用派生类的析构函数。

再这样的情况下对于派生类申请的空间就得不到释放从而产生了内存泄漏。

为了防止这样的情况发生,C++中基类的析构函数就需要采取virtual的虚构函数,实现动态绑定,这样才可以。

至于什么是动态绑定与静态绑定可以看看这篇文章:动态多态与静态多态

学习代码

#include<iostream>
using namespace std;


class A
{
public:
    A(){
        
    }
    ~A(){
        cout << "A discontruct" << endl;
    }
	virtual string OnPaint() = 0; // 定义接口
};

class B : public A
{
public:
	virtual string OnPaint()
	{
		cout<< "B" << endl;
		return "B";
	}
	~B(){
	    cout << "B discontruct" << endl;
	}
};

class C : public A
{
public:
	virtual string OnPaint()
	{
		cout<< "C" << endl;
		return "C";
	}
	~C(){
	    cout << "C discontruct" << endl;
	}
};

int main()
{
	A* p = new B();
	p->OnPaint(); // B
	delete p;

	p = new C(); 
	p->OnPaint(); // C
	delete p;
	
	return 0;
}

运行结果
通过运行结果我们可以发现,派生类的内存没有得到释放。
在这里插入图片描述

改进办法

#include<iostream>
using namespace std;


class A
{
public:
    A(){
        
    }
    virtual ~A(){
        cout << "A discontruct" << endl;
    }
	virtual string OnPaint() = 0; // 定义接口
};

class B : public A
{
public:
	virtual string OnPaint()
	{
		cout<< "B" << endl;
		return "B";
	}
	virtual ~B(){
	    cout << "B discontruct" << endl;
	}
};

class C : public A
{
public:
	virtual string OnPaint()
	{
		cout<< "C" << endl;
		return "C";
	}
	virtual ~C(){
	    cout << "C discontruct" << endl;
	}
};

int main()
{
	A* p = new B();
	p->OnPaint(); // B
	delete p;

	p = new C(); 
	p->OnPaint(); // C
	delete p;
	
	return 0;
}

运行结果
通过把析构函数定义为虚函数,实现了派生类的内存释放。
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客李华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值