声明析构函数虚拟就足够了吗?

Is it enough to declare destructor virtual?

本文关键字:析构函数 虚拟 声明      更新时间:2023-10-16

>当我有一个需要虚拟析构函数的类时,将其声明为虚拟(并让编译器生成定义)就足够了,还是必须显式定义它?

如果编译器为您生成析构函数:

§12.4/4 如果一个类没有用户声明的析构函数,则析构函数是 隐式声明为默认值 (8.4)。隐式声明 析构函数是其类的内联公共成员。

请注意,您可以执行以下操作:

virtual ~Struct() = default;

6 否则,析构函数是非平凡的。析构函数是 默认值和未定义为已删除时隐式定义 ODR 用于 (3.2) 销毁其类类型 (3.7) 的对象或当它 在其第一次声明后显式默认。

或:

virtual ~Struct() { }

诚然,"用户声明"和"用户提供"之间的区别非常令人困惑,所以这里是相关部分:

§8.4.3/4 显式默认函数和隐式声明 函数统称为默认函数,并且 实施应为它们提供隐含的定义(12.1 12.4, 12.8),这可能意味着将它们定义为已删除。如果特殊成员函数是用户声明的而不是显式的,则由用户提供 在其第一个声明中默认或删除。用户提供的 显式默认函数(即在其之后显式默认 第一个声明)在显式定义的位置 违约;如果此类函数隐式定义为已删除,则 程序格式不正确。

你必须

明确地说virtual ~destructorName()。默认情况下,仅仅因为您有一个派生类,并不能使 bass 类的析构函数成为虚拟。