class Base
{
public:
~Base(){...}
...
};
class Child:public Base
{
public:
~Child(){...}
};
int main()
{
Child c;
...
return 0;
}
上面代码运行时,在生成Child对象c时,实际上先调用基类Base的构造函数,然后再调用Child类的构造函数。当撤销c时,先调用Child的析构函数,然后在调用Base的析构函数,也就是说,无论基类的析构函数是否为虚构函数,肯定会依次调用其基类的析构函数。根本原因:上面所有对象都存在于栈中,当其离开作用域时,该对象会被自动撤销。
然而为什么还要搞个虚构函数呢?
这是因为多态的存在。
Base *pBase;
Child c;
pBase =& c;
那么,当pBase被撤销时呢?如果Base的析构函数不是virtual,那么根据静态联编,显然会调用Base的析构函数,而不会调用Child类的析构函数。而如果Base的析构函数改为virtual,当pBase指针被撤销时,就会先调用Child类析构函数,再调用Base类的析构函数。根本原因:上面过程是动态联编,在堆中进行,如果不将基类析构函数设置为virtual,则会造成内存泄露。基类析构函数设置为virtual后,所有派生类的析构函数都将会是virtual。