虚析构8种运行情况

 

为什么析构函数要用虚析构:防止子类析构不被调用;防止在调用析构函数时崩溃。

例子如下:

#include <iostream>

using namespace std;

 

class A

{

public:

      A()

      {

             cout << "A() ..." << endl;

      }

      virtual ~A()

      {

             cout << "~A() ..." << endl;

      }

};

 

class B

{

public:

      B()

      {

             cout << "B() ..." << endl;

      }

      virtual ~B()

      {

             cout << "~B() ..." << endl;

      }

};

 

 

class C: public A, public B

{

public:

      C()

      {

             cout << "C() ..." << endl;

      }

      ~C()

      {

             cout << "~C() ..." << endl;

      }

};

 

 

 

void main()

{

//    B* p = new C;

//    delete p;

 

/*

A() ...

B() ...

C() ...

~B() ...

崩溃

*/

 

      // virtual ~A()

//    B* p = new C;

//    delete p;

     

/*

A() ...

B() ...

C() ...

~B() ...

崩溃    

*/   

     

      // virtual ~B()

//    B* p = new C;

//    delete p;

 

/*

A() ...

B() ...

C() ...

~C() ...

~B() ...

~A() ...

*/

 

             // virtual ~A, ~B

             B* p = new C;

             delete p;

/*

A() ...

B() ...

C() ...

~C() ...

~B() ...

~A() ... 

*/

 

 

      return;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#include <iostream>

using namespace std;

 

class A

{

public:

       A()

       {

              cout << "A() ..." << endl;

       }

       virtual ~A()

       {

              cout << "~A() ..." << endl;

       }

};

 

class B

{

public:

       B()

       {

              cout << "B() ..." << endl;

       }

       virtual ~B()

       {

              cout << "~B() ..." << endl;

       }

};

 

 

class C: public A, public B

{

public:

       C()

       {

              cout << "C() ..." << endl;

       }

       ~C()

       {

              cout << "~C() ..." << endl;

       }

};

 

 

 

void main()

{

//     A* p = new C;

//     delete p;

 

/*

A() ...

B() ...

C() ...

~A() ...

*/

 

       // virtual ~A()

//     A* p = new C;

//     delete p;     

/*

A() ...

B() ...

C() ...

~C() ...

~B() ...

~A() ...  

*/    

      

       // virtual ~B()

//     A* p = new C;

//     delete p;

/*

A() ...

B() ...

C() ...

~A() ...

崩溃     

*/

              // virtual ~A, ~B

              A* p = new C;

              delete p;

/*

A() ...

B() ...

C() ...

~C() ...

~B() ...

~A() ...  

*/

       return;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

总结:注意在定义基类时,必须将析构函数定义为虚析构,防止程序崩溃或子类对象析构不被调用的情况发生。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值