详解 C++ virtual 析构函数

来源:互联网 发布:网络应用跨平台部署 编辑:程序博客网 时间:2024/06/07 16:49

第一种情况:基类指针指向派生类对象。

#include <iostream>using namespace std; class Base{  public:    ~Base() {cout<<"~B"<<endl;}}; class Derived:public Base{  public:    ~Derived() {cout<<"~D"<<endl;}}; int main (){  Base *b = new Derived; //注意这里  delete b;}
这里只有基类(Base)会被析构掉,派生类(Derived)没有被析构。

第二种情况:派生类指针指向派生类对象。

#include <iostream>using namespace std; class Base{  public:    ~Base() {cout<<"~B"<<endl;}}; class Derived:public Base{  public:    ~Derived() {cout<<"~D"<<endl;}}; int main (){  Derived *d = new Derived; //注意这里  delete d;}

这次基类和派生类都能被析构掉。

第三种情况:基类指针指向派生类对象,但析构函数是virtual 的。

class Base{ public:  virtual ~Base(){cout<<"~B"<<endl;}; } class Derived:public Base{ public:  virtual ~Derived(){cout<<"~D"<<endl;}; } void main (){   Base *b=new Derived();  delete b; } 
这时,基类和派生类对象都能被析构掉。