使用虚拟析构函数,我是否需要为每个子类显式声明一个虚拟析构函数?

时间:2011-04-10 06:22:25

标签: c++ virtual-destructor

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

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

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

通常,如果某个函数在基类中声明为virtual,则不需要在子类中显式声明它为virtual。不过这是很好的做法。

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