关于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!

 

 

 

你可能感兴趣的:(C++)