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

是否需要定义虚拟析构函数? < C++析构函数是否需要定义为虚拟?如果是,为什么?我已经读到,它们需要确保在将基类指针强制转换到派生类时进行适当的清理。,c++,C++,这不是正式要求的-您可以轻松地使用虚拟函数编译类,但不能使用虚拟析构函数,但这是不明智的 假设您有一个基类a,两个派生类B和C。B和C有不同的字段,需要在析构函数中进行不同的清理 现在你分配 A *p = new B(); 那么,当你打电话的时候 delete p; < >编译器不知道调用哪个析构函数(实际上这是一个未定义的行为,根据C++标准)。 如果不定义虚拟析构函数,则只能调用a的析构函数,这在假设的类B中是不够的 如果您从未使用new关键字实例化您的类(之后使用deleteit),则

这不是正式要求的-您可以轻松地使用虚拟函数编译类,但不能使用虚拟析构函数,但这是不明智的

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

现在你分配

A *p = new B();
那么,当你打电话的时候

delete p;
< >编译器不知道调用哪个析构函数(实际上这是一个未定义的行为,根据C++标准)。 如果不定义虚拟析构函数,则只能调用a的析构函数,这在假设的类B中是不够的


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

需要虚拟析构函数才能将析构函数调用动态分派到层次结构树中的适当类

在以下情况下:

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

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

不需要,但强烈建议使用。您能详细说明一下吗?一个例子就好了。