关于C++虚析构函数

/***这个低端了,之前我还不知道虚析构函数的作用生病***/

先看一个例子

 #include <iostream>
using namespace std;
class Base{
public:
    Base(){
        cout<<"Base constructed!"<<endl;//基类构造函数
    }
    ~Base(){
        cout<<"Base1 destructed!"<<endl;//基类析构
    }
};
class Deliver1:public Base{
public:
    Deliver1(){
        cout<<"Deliver1 constructed!"<<endl;//派生1构造
    }
    ~Deliver1(){
        cout<<"Deliver1 destructed!"<<endl;//派生1析构
    }
};
class Deliver2:public Deliver1{
public:
    Deliver2(){
        cout<<"Deliver2 constructed!"<<endl;//派生2构造
    }
    ~Deliver2(){
        cout<<"Deliver2 destructed!"<<endl;//派生2析构
    }
};


int main(){
    Deliver2 D;
    return 0;
}

那么运行的结果如下:

Base constructed!
Delever1 constructed!
Deliver2 constructed!
Deliver2 destructed!
Deliver1 destructed!
Base destructed!

如果哦使用动态元素,即main函数变为:

 

int main(){
    Base1 
*D=new Deliver2();
    delete D;
    
return 0;
}

 

则运行结果如下

Base constructed!
Delever1 constructed!
Deliver2 constructed!
Base destructed!

恐怖的事情就这样发生了,析构函数只调用了基类的,子类的资源全没有释放!

于是就有了虚析构函数

我们知道,如果一个函数在基类中被定义为虚函数,那么不管派生类有没有加virtual关键字,这个函数都是虚函数。

同样的,如果一个基类的析构函数被说明为虚析构函数,则它的派生类中的析构函数也是虚析构函数,不管它是否使用了关键字virtual。

于是我们把基类的析构函数改写为:

 

 virtual ~Base(){
        cout
<<"Base1 destructed!"<<endl;//基类析构
  }

 

那么运行结果就正常了

Base constructed!
Delever1 constructed!
Deliver2 constructed!
Deliver2 destructed!
Deliver1 destructed!
Base destructed!

 

 

 

posted @ 2010-01-27 14:18  Justin Wong  阅读(349)  评论(0编辑  收藏  举报