【发布时间】:2011-08-02 09:08:16
【问题描述】:
我有一个场景,我正在编写一些深入的面向对象的代码,具有多层抽象基类,我想知道是否必须为每一个显式声明一个析构函数。
编译器会生成一个已经是虚拟的默认值,还是我必须告诉它?
【问题讨论】:
-
我注意到,在下面的评论中,您还询问是否需要为每个子类定义析构函数。答案是否定的。
我有一个场景,我正在编写一些深入的面向对象的代码,具有多层抽象基类,我想知道是否必须为每一个显式声明一个析构函数。
编译器会生成一个已经是虚拟的默认值,还是我必须告诉它?
【问题讨论】:
默认析构函数不是虚拟的。如果您将基类的析构函数声明为虚拟,则子类的析构函数将被覆盖,因此即使没有明确声明它们也是虚拟的。
如果你有一个类层次结构并且你的基类没有声明析构函数是虚拟的,GNU GCC 编译器甚至会给出一个警告,因为你很可能希望它是。
【讨论】:
~ClassName() override = default 是否合理,据我了解,override 关键字也暗示了virtual,但如果有错误,请纠正我! :-)
答案是否定的。这里唯一相关的要求是具有 vtable(即,具有至少一个虚函数)的类必须在其继承链的某个位置至少有一个虚析构函数。通常这意味着您的基本基类将提供一个空的虚拟析构函数。
【讨论】:
一般来说,如果某些函数在基类中声明为虚拟,则无需在子类中显式声明为虚拟。但是,这是一种很好的做法。
将子类中的析构函数显式声明为 virtual 不会给您带来任何重大优势,因此如果您不想再编写一个 virtual,请不要这样做。
【讨论】: