析构函数在默认情况下不是虚拟的,在不需要的时候不会受到伤害,这很好。
但是,在基类派生类场景中,是否存在没有虚拟析构函数的用例?如果没有,编译器可以(是否合理)抱怨某个类派生自定义了公共非虚拟析构函数(或没有析构函数)的基类。而不仅仅是警告。
发布于 2010-06-20 23:14:05
您的想法的问题是,可以想象有人正在使用非虚拟基类析构函数作为优化(如果您永远不会通过基类指针破坏,那么丢失的虚拟元素不会伤害您,并且仍然会避免vtable条目)。
因为它可以使用,所以是允许的。我认为一个可选的编译器警告可能是一个好主意,但不是语言规范中的东西。
发布于 2010-06-20 23:19:03
因为有一个非虚拟的析构函数是完全有效的。例如,如果子类仅设计为堆栈分配,则不需要虚拟析构函数。为什么要求客户端拥有所有的vtbl机器,而类只应该是一个装饰者呢?
当类要从私有(按实现的术语)继承时,使用虚拟析构函数也是没有意义的。
总之,析构函数通常应该是公共的、虚拟的或受保护的,除非类不是基类。
发布于 2010-06-20 23:43:19
只有在通过delete对对象执行多态销毁时,才需要虚拟析构函数。这反过来又意味着动态分配(new-ed)对象。
如果不动态分配对象,则不需要虚拟析构函数。当不需要基类中的虚拟析构函数时,这立即提供了无限的用例源。
如果您动态地分配对象,但从未以多形性方式销毁它们,则不需要虚拟析构函数。当不需要基类中的虚拟析取器时,这会添加另一组用例。
https://stackoverflow.com/questions/3081246
复制相似问题