C ++析构函数是否需要定义为虚拟?如果是这样的话?我已经读过他们需要确保在将基类指针强制转换为派生类时进行适当的清理。
答案 0 :(得分:5)
虚拟析构函数需要允许将析构函数调用动态分派给层次结构树中的正确类。
在您拥有的情况下:
Base *d = new Derived();
delete d;
没有virtual
析构函数,您有未定义的行为。这是因为编译器无法为Derived
找到最专业的析构函数,因为它未被声明为virtual
。
答案 1 :(得分:2)
这不是正式的 - 你可以轻松地编译一个具有虚函数但没有虚拟析构函数的类,但那是不明智的。
想象一下,你有一个基类A,两个派生类B和C. B和C有不同的字段,需要在析构函数中进行不同的清理。
现在你分配
A *p = new B();
然后,当你打电话
delete p;
编译器不知道要调用哪个析构函数(实际上这是根据C ++标准的未定义行为)。
如果您没有定义虚拟析构函数,则只能调用A的析构函数,这对于我们假设的B类来说是不够的。
如果您从未使用new
关键字(以及之后的delete
)来实例化您的课程,那么您就不需要虚拟析构函数。但是,添加虚拟析构函数并不会影响性能,因此最好始终提供它。