21

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

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

4

3 回答 3

17

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

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

于 2011-04-10T06:31:19.060 回答
5

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

于 2011-04-10T06:35:27.317 回答
3

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

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

于 2011-04-10T06:27:59.583 回答