声明析构函数虚拟就足够了吗?
Is it enough to declare destructor virtual?
>当我有一个需要虚拟析构函数的类时,将其声明为虚拟(并让编译器生成定义)就足够了,还是必须显式定义它?
如果编译器为您生成析构函数:
§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 类的析构函数成为虚拟。
相关文章:
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- "虚拟""覆盖"析构函数
- 程序永远不会进入虚拟析构函数
- C++ std::vector 中的虚拟析构函数继承
- 哪种方法更适合处理虚拟析构函数?
- 拥有"受保护的非虚拟析构函数"与"受保护虚拟析构构函数"有什么好处
- 带有未解析外部元素的C++虚拟析构函数
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 从内部类的析构函数调用虚拟函数
- C++切片和虚拟析构函数
- C++虚拟继承、虚拟析构函数和 dynamic_cast<void*>
- 添加虚拟析构函数会使代码大小膨胀
- 应该是虚拟析构函数吗?但是怎么做呢?
- 虚拟析构函数将对象移出 rodata 部分
- 为什么虚拟类的析构函数不会自动添加到 vtable 中?
- 如何将 std::unique_ptr<Parent> 与具有受保护虚拟析构函数的只读父类一起使用
- DIRECTX9 中自定义顶点的虚拟析构函数
- 声明析构函数虚拟就足够了吗?