原因:在多态的情况,存在一种情况就是使用基类指针指向派生类对象,这样就可以实现多态的使用。基类指针调用派生类函数。然而在结束时需要删除对象,这个时候如果直接使用基类指针删除对象,那么由于对象的指针作用域,指针只会调用基类的析构函数,释放基类析构函数中的操作。但不会执行派生类中析构函数,这样派生类析构函数中所有的操作都得不到执行。那么肯定会漏掉很多的操作,典型的派生类所申请内存空间的释放,可能就在析构函数中释放,无法执行到自然就没有释放,产生内存泄漏问题。
#include <iostream>
using namespace std;
class base{
public:
base(){
};
virtual baseDoSomething(){
cout << "Do thing virtual base"; }
~base(){
cout << "base class destory construct@" << endl; }
};
class inherBase:public base{
public:
inherBase(){
};
virtual inherDoSomething(){
cout <<"Do thing inherbase"; }
~inherBase(){
cout << "inher class destory construct@@@" << endl; }
};
int main(int argc, char** argv)
{
base* bs = new base();
base* ibs = new inherBase();
delecte ibs;
}
运行结果
base class destory construct@
只执行了基类的析构函数,而没有执行派生类中的析构函数。我们本意是释放派生类的对象的。所以在基类的析构函数前加上virtual关键字。
class base{
public:
base(){
};
virtual baseDoSomething(){
cout << "Do thing virtual base"; }
virtual ~base(){
cout << "base destory construct@" << endl; }
};
运行结果
inher class destory construct@@@
base class destory construct@
这个增加virtual关键字后的析构函数在虚函数表中,同样的派生类析构函数会自动的被加上virtual关键字,同时也在虚函数表中。这样通过基类的虚函数表中的指针就可以访问到派生类的析构函数。这样在多态派生类转换成基类指针也可以通过虚函数来调用派生类析构函数来完成对派生类析构操作。
其实还是不明白为什么基类析构函数加上virtual关键字后,派生类的析构函数会被自动加上virtual关键字从而成为虚析构函数???编译器是如何判断实现的呢?