首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么基类不强制(C++)虚拟析构函数

为什么基类不强制(C++)虚拟析构函数
EN

Stack Overflow用户
提问于 2010-06-20 23:03:30
回答 4查看 1.6K关注 0票数 13

析构函数在默认情况下不是虚拟的,在不需要的时候不会受到伤害,这很好。

但是,在基类派生类场景中,是否存在没有虚拟析构函数的用例?如果没有,编译器可以(是否合理)抱怨某个类派生自定义了公共非虚拟析构函数(或没有析构函数)的基类。而不仅仅是警告。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-20 23:14:05

您的想法的问题是,可以想象有人正在使用非虚拟基类析构函数作为优化(如果您永远不会通过基类指针破坏,那么丢失的虚拟元素不会伤害您,并且仍然会避免vtable条目)。

因为它可以使用,所以是允许的。我认为一个可选的编译器警告可能是一个好主意,但不是语言规范中的东西。

票数 12
EN

Stack Overflow用户

发布于 2010-06-20 23:19:03

因为有一个非虚拟的析构函数是完全有效的。例如,如果子类仅设计为堆栈分配,则不需要虚拟析构函数。为什么要求客户端拥有所有的vtbl机器,而类只应该是一个装饰者呢?

当类要从私有(按实现的术语)继承时,使用虚拟析构函数也是没有意义的。

总之,析构函数通常应该是公共的、虚拟的或受保护的,除非类不是基类。

票数 8
EN

Stack Overflow用户

发布于 2010-06-20 23:43:19

只有在通过delete对对象执行多态销毁时,才需要虚拟析构函数。这反过来又意味着动态分配(new-ed)对象。

如果不动态分配对象,则不需要虚拟析构函数。当不需要基类中的虚拟析构函数时,这立即提供了无限的用例源。

如果您动态地分配对象,但从未以多形性方式销毁它们,则不需要虚拟析构函数。当不需要基类中的虚拟析取器时,这会添加另一组用例。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3081246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档