C++ 对于虚拟析构函数,我是否需要为每个子类显式声明一个虚拟析构函数?

C++ 对于虚拟析构函数,我是否需要为每个子类显式声明一个虚拟析构函数?,c++,virtual-destructor,C++,Virtual Destructor,我有一个场景,在这个场景中,我正在编写一些深层的面向对象代码,带有多层抽象基类,我想知道是否必须为每个基类显式声明一个析构函数 编译器会生成一个已经是虚拟的默认编译器,还是我必须告诉它 通常,如果某个函数在基类中声明为虚函数,则无需在子类中显式声明为虚函数。然而,这是一种良好的做法 在子类中将析构函数显式声明为virtual不会给您带来任何严重的好处,因此如果您不想再编写一个virtual,请不要这样做。默认析构函数不是virtual。如果将基类的析构函数声明为virtual,则子类的析构函数将

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


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

通常,如果某个函数在基类中声明为虚函数,则无需在子类中显式声明为虚函数。然而,这是一种良好的做法


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

默认析构函数不是virtual。如果将基类的析构函数声明为virtual,则子类的析构函数将被重写,因此即使没有显式声明它们为virtual,也将是virtual


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

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

我需要在实现中包含定义吗?这将导致大量空析构函数将我的代码弄乱。您可能是指析构函数,而不是构造函数。gcc仅在您有虚拟方法但析构函数不是虚拟的情况下发出警告。您可以完全从类继承而不使用任何虚拟方法,这对于元编程非常方便:)遵循此建议,将默认析构函数声明为:
~ClassName()override=default
根据我的理解,
override
关键字也意味着
virtual
,是否合理,但是如果错了,请纠正我!:-)我注意到,在下面的评论中,您还询问是否需要为每个子类定义析构函数。答案是否定的。