C++析构函数定义为virtual虚函数,有什么作用?
C++析构函数定义为virtual虚函数,有什么作用?
C++析构函数定义为virtual虚函数,有什么作用?简介:析构函数定义为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;
}
运行结果
通过把析构函数定义为虚函数,实现了派生类的内存释放。
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 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分钟前 发表 |
如果派生类中申请了内存空间 |