C++中基类析构函数为什么总是虚方法
2022/2/6 14:43:31
本文主要是介绍C++中基类析构函数为什么总是虚方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
当我们采用如下方式直接定义一个子类的对象的时候,我们知道由于子类继承于基类,所以在main函数结束返回时,程序会先调用子类的析构函数,再调用基类的析构函数。
int main() { SubClass c; return 0; }
但为了实现C++的多态,我们经常要用一个基类的指针指向一个子类的数据:
BaseClass *c = new SubClass;
这时编译器会认为指针是基类的,因此在我们释放指针时,程序就不会运行子类的析构函数,而只运行了基类的析构函数。而如果在子类的析构函数中存在着重要的释放内存的操作,那么此时就会导致内存泄漏问题。
以如下代码作为实验代码来看看如果我们不将基类的析构函数定义为虚方法会产生什么结果:
#include <iostream> using namespace std; class BaseClass { public: BaseClass() { }; ~BaseClass() { cout << "In ~BaseClass" << endl; }; }; class SubClass : public BaseClass { public: SubClass() { }; ~SubClass() { cout << "In ~subclass" << endl; }; }; int main() { BaseClass *c = new SubClass; delete c; return 0; }
运行结果:
In ~BaseClass
可以看到,程序只打印了基类的析构函数中的内容,也就是程序没有运行子类的析构函数。
将基类析构函数定义为虚方法
将函数定义为虚方法,是为了告诉编译器,要根据运行时候的指针的类型而有选择地调用正确的方法,而new分配内存给指针的方式,指针只有在运行时候才是子类,因此将基类的析构器定义为虚方法:
virtual ~BaseClass()
就能让程序在释放指针时运行子类的析构函数。
修改代码如下:
#include <iostream> using namespace std; class BaseClass { public: BaseClass() { }; virtual ~BaseClass() { cout << "In ~BaseClass" << endl; }; }; class SubClass : public BaseClass { public: SubClass() { }; ~SubClass() { cout << "In ~subclass" << endl; }; }; int main() { BaseClass *c = new SubClass; delete c; return 0; }
程序运行结果:
In ~subclass In ~BaseClass
此时在析构时,程序能够运行子类和基类的析构函数。
这篇关于C++中基类析构函数为什么总是虚方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享