为什么c++11的标准中对于class要加入final?
2022/7/6 14:22:09
本文主要是介绍为什么c++11的标准中对于class要加入final?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Effective C++ 中,条款 07 提到:“如果你曾经企图继承一个标准容器或任何其他“带有 non-virtual 析构函数”的 class,拒绝诱惑吧!”。
直接来看代码,再作出解释:
struct Base { ~Base() {} }; struct Derived : public Base { int *x; Derived(int *_x) : x(x) {} ~Derived() { delete x; } };
上诉代码,定义了基类 Base
和派生类 Derived
。 然而,如果我们执行如下的代码,就会发生内存泄漏的错误。
int *x = new int; Derived *d = new Derived(x); Base *pb = d; delete pb;
Derived*
转换为 Base*
,然后删除 Base*
。 删除操作将会调用 Base
的析构函数,而不是 Derived
的析构函数,这将导致 Derived
的成员变量 x
的内存不会释放,导致内存泄漏。
因此,如果在 Base
中加入 final
关键字,就可以防止“不应该”的继承发生。
这篇关于为什么c++11的标准中对于class要加入final?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 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专业技术文章分享