为什么在继承时我们需要一个带有动态变量的虚析构函数?在静态/动态情况下析构函数执行的顺序是什么?最派生类的析构函数是否总是先执行?
答案 0 :(得分:4)
当您通过基类指针尝试virtual
派生类对象时,在基类中需要一个delete
析构函数。
pont案例:
class Foo
{
public:
virtual ~Foo(){};
};
class Bar : public Foo
{
public:
~Bar() { std::cout << "Bye-Bye, Bar"; }
};
int main()
{
Foo* f = new Bar;
delete f;
}
如果基类中没有virtual
析构函数,则不会在此处调用Bar
的析构函数。
答案 1 :(得分:2)
想象一下你有这个:
class A {
public:
int* x;
}
class B : public A {
public:
int *y;
}
main() {
A *var = new B;
delete var;
}
请假设一些构造函数析构函数。 在这种情况下,当你删除A.如果你有虚拟析构函数,那么将首先调用B析构函数来释放y,然后调用A来释放x。
如果它不是虚拟的,它只会调用A的析构函数泄漏y。
问题是编译器无法事先知道它应该调用哪个析构函数。想象一下,你有一个如果构造A或B取决于一些输入并将其赋值给var。 通过使其成为虚拟,您可以使编译器在实际调用之前执行调用。在运行时,它将根据vtable知道哪个是正确的析构函数。