是否需要定义虚拟析构函数

Is it a requirement to define a virtual destructor?

本文关键字:虚拟 析构函数 定义 是否      更新时间:2023-10-16

C++析构函数是否需要定义为虚拟的?如果是这样,为什么?我已经读到,当将基类指针强制转换为派生类时,它们需要确保适当的清理。

需要虚拟析构函数才能允许将析构函数调用动态调度到层次结构树中的正确类。

在以下情况下:

Base *d = new Derived();
delete d;

如果没有 virtual 析构函数,您将有未定义的行为。这是因为编译器无法为Derived找到最专业的析构函数,因为它没有声明为 virtual

它不是正式要求的 - 你可以很容易地编译一个带有虚函数的类,但不能编译一个虚拟析构函数,但这是不明智的。

假设您有一个基类 A,以及两个派生类 B 和 C.B 和 C 具有不同的字段,需要在析构函数中进行不同的清理。

现在你分配

A *p = new B();

然后,当您致电时

delete p;

编译器不知道要调用哪个析构函数(实际上,根据C++标准,这是一种未定义的行为)。

如果不定义虚拟析构函数,则只能调用 A 的析构函数,这在我们假设的类 B 的情况下是不够的。

如果您从不使用 new 关键字实例化您的类(然后delete它),则不需要虚拟析构函数。但是,添加虚拟析构函数不会影响性能,因此最好始终提供它。