当我有一个需要虚拟析构函数的类时,它是否足以将其声明为虚拟(并让编译器生成定义)或者我必须明确定义它吗?
答案 0 :(得分:2)
如果编译器为您生成析构函数:
§12.4/ 4如果一个类没有用户声明的析构函数,那么析构函数就是 隐含地宣布为违约(8.4)。一个隐含声明的 析构函数是其类的内联公共成员。
请注意,您可以这样做:
virtual ~Struct() = default;
6否则,析构函数是非平凡的。一个析构函数 默认情况下,未定义为已删除的内容是隐式定义的 odr-used(3.2)用于销毁其类类型(3.7)或其类型的对象 在第一次声明后明确默认。
或者:
virtual ~Struct() { }
不可否认,“用户声明”和“用户提供”之间的区别非常令人困惑,所以这里是相关部分:
§8.4.3/ 4明确违约的函数并隐式声明 函数统称为默认函数,以及 实施应为它们提供隐含的定义(12.1 12.4, 12.8),这可能意味着将它们定义为已删除。如果用户声明且未明确指定,则特殊成员函数是用户提供的 在第一次声明中违约或删除。用户提供的 明确默认的功能(即明确违约后的功能) 第一个声明)是在明确的地方定义的 违约;如果将这样的函数隐式定义为已删除,则 节目形成不良。
答案 1 :(得分:0)
您必须明确说出virtual ~destructorName()
。仅仅因为你有一个派生类,默认情况下不会使低音类的析构函数变为虚拟。