您现在的位置是:首页 > 编程 > 

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

2025-07-20 01:10:40
C++析构函数定义为virtual虚函数,有什么作用? C++析构函数定义为virtual虚函数,有什么作用?简介:析构函数定义为virtual虚函数,有什么作用?代码讲解简单的说,C++中基类采用virtual虚析构函数是为了防止内存泄漏,如果派生类中申请了内存空间,并在析构函数中对这些内存空间进行了释放。如果这个时候基类中采取的是非虚构函数,那么当删除基类指针的死后,指向派生类对象的时候就不会

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

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

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

代码讲解

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

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

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

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

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

学习代码

代码语言:javascript代码运行次数:0运行复制
#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;
}

运行结果

通过运行结果我们可以发现,派生类的内存没有得到释放。

改进办法

代码语言:javascript代码运行次数: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;
}

运行结果

通过把析构函数定义为虚函数,实现了派生类的内存释放。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:202-0-15,如有侵权请联系 cloudcommunity@tencent 删除函数接口内存c++virtual

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1150159.html

相关标签:无
上传时间: 2025-07-19 21:28:54
留言与评论(共有 10 条评论)
本站网友 ff9
6分钟前 发表
public A { public
本站网友 用药剂量
26分钟前 发表
而不会调用派生类的析构函数
本站网友 南湖中园
8分钟前 发表
而不会调用派生类的析构函数
本站网友 周晓峰
25分钟前 发表
派生类的内存没有得到释放
本站网友 共富二手房
23分钟前 发表
有什么作用?代码讲解简单的说
本站网友 孕妇dha什么牌子好
24分钟前 发表
public A { public
本站网友 梦到怀孕
19分钟前 发表
C++析构函数定义为virtual虚函数
本站网友 三季片
18分钟前 发表
本文参与 腾讯云自媒体同步曝光计划
本站网友 撒旦撒旦
19分钟前 发表
如果派生类中申请了内存空间