声明析构函数是否足够?

时间:2014-11-20 21:47:10

标签: c++ virtual-destructor

当我有一个需要虚拟析构函数的类时,它是否足以将其声明为虚拟(并让编译器生成定义)或者我必须明确定义它吗?

2 个答案:

答案 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()。仅仅因为你有一个派生类,默认情况下不会使低音类的析构函数变为虚拟。