【问题标题】:With virtual destructors, do I need to explicitly declare a virtual destructor for each subclass?使用虚拟析构函数,我是否需要为每个子类显式声明一个虚拟析构函数?
【发布时间】:2011-08-02 09:08:16
【问题描述】:

我有一个场景,我正在编写一些深入的面向对象的代码,具有多层抽象基类,我想知道是否必须为每一个显式声明一个析构函数。

编译器会生成一个已经是虚拟的默认值,还是我必须告诉它?

【问题讨论】:

  • 我注意到,在下面的评论中,您还询问是否需要为每个子类定义析构函数。答案是否定的。

标签: c++ virtual-destructor


【解决方案1】:

默认析构函数不是虚拟的。如果您将基类的析构函数声明为虚拟,则子类的析构函数将被覆盖,因此即使没有明确声明它们也是虚拟的。

如果你有一个类层次结构并且你的基类没有声明析构函数是虚拟的,GNU GCC 编译器甚至会给出一个警告,因为你很可能希望它是。

【讨论】:

  • 你可能指的是析构函数,而不是构造函数。
  • gcc 只发出警告如果你有一个虚拟方法但是析构函数不是虚拟的。你可以完美地继承一个没有任何虚方法的类,这对于元编程很方便:)
  • 遵循这个建议,将默认析构函数声明为:~ClassName() override = default 是否合理,据我了解,override 关键字也暗示了virtual,但如果有错误,请纠正我! :-)
【解决方案2】:

答案是否定的。这里唯一相关的要求是具有 vtable(,具有至少一个虚函数)的类必须在其继承链的某个位置至少有一个虚析构函数。通常这意味着您的基本基类将提供一个空的虚拟析构函数。

【讨论】:

    【解决方案3】:

    一般来说,如果某些函数在基类中声明为虚拟,则无需在子类中显式声明为虚拟。但是,这是一种很好的做法。

    将子类中的析构函数显式声明为 virtual 不会给您带来任何重大优势,因此如果您不想再编写一个 virtual,请不要这样做。

    【讨论】:

    • 我需要在实现中包含一个定义吗?这会导致大量空析构函数使我的代码混乱。
    猜你喜欢
    • 2012-02-24
    • 2010-10-15
    • 2012-06-26
    • 2021-08-22
    • 2011-03-30
    • 2023-02-01
    • 2010-09-26
    • 2013-07-06
    相关资源
    最近更新 更多