虚析构函数

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

class Base{
public:
    virtual ~Base(){
        cout<<"Base deconstruct func"<<endl;
    }
};

class Derive: public Base{
public:
    ~Derive(){
        cout<<"Derive deconstruct func"<<endl;
    }
};

int main()
{
    Derive *p = new Derive();
    delete p;
    //使用派生类指针指向派生类,会自动调用基类析构函数
    
    Base *p1 = new Derive();
    delete p1;
    //使用基类指针指向派生类,只有当基类析构函数定位为虚函数的时候,才会自动调用派生类析构函数,然后在调用基类的析构函数 与虚函数表有关

    system("pause");
    return 0;
}

  当然不一定要把所有的析构函数都设置成虚函数,因为会增加空间消耗。

  真相大白:delete p1时,p1类型Base类中包含虚析构函数,所以p1实际指向的是派生类Derive对象,Derive继承了Base,派生类中包含虚表,通过vptr -> vtable[0]->Derive的析构函数->Derive子类进而调用父类Base的析构函数。

  继承关系中,析构从子类开始之后自动调用父类的因此关键是要找到 子类的析构函数。 Base 指针指向了 derive中 Base object 区域,如果 Base 析构virtual的话,那么会绑定到子类的析构函数。

posted on 2016-11-14 11:01  暴力的轮胎  阅读(173)  评论(0编辑  收藏  举报

导航