继承时调用析构函数可能会出现的问题

调用析构函数可能会出现的问题

先看下面一段代码

#include<iostream>

using namespace std;

 class something

 {

  public:

     something(){cout<<"2";}

      ~something(){cout<<"2";}

 };

 class parent

 { 

  public:

   parent(){cout<<"1";}

   ~parent(){cout<<"1";}

 };

 class child:public parent

 {

   public:

    child(){cout<<"3";}

     ~child(){cout<<"3";} 

   protected:

     something mdatamember;

 };

int main()

 {

   child mychild;

   return 0;

 }

上面这段代码的执行结果是123321,先调用对应的构造函数再调用析构函数

问题就在这里产生了,如果我定义一个基类指针,使它指向子类申请的空间,并释放这段内存,看看结果会是什么样?

#include<iostream>

using namespace std;

 class something

 {

  public:

     something(){cout<<"2";}

      ~something(){cout<<"2";}

 };

 class parent

 { 

  public:

   parent(){cout<<"1";}

   ~parent(){cout<<"1";}

 };

 class child:public parent

 {

   public:

    child(){cout<<"3";}

     ~child(){cout<<"3";} 

   protected:

     something mdatamember;

 };

int main()

 {

   parent*mychild=new child;

   delete mychild;

   return 0;

 }

理想中的结果是123321,也就是调用了哪些类的构造函数,该类对应的析构函数也应该被调用,可是上面这段代码的执行结果是1231。没有调用类something、类child的析构函数。

这样就不能完全把释放完毕空间。这是因为parent类指针只能调用其本身类中的析构函数。

为了能完全把空间释放完毕,可以用虚函数实现,也就是在每个析构函数前面加上一个virtual即可!

代码如下

#include<iostream>

using namespace std;

 class something

 {

  public:

     something(){cout<<"2";}

     virtual ~something(){cout<<"2";}

 };

 class parent

 { 

  public:

   parent(){cout<<"1";}

   virtual ~parent(){cout<<"1";}

 };

 class child:public parent

 {

   public:

    child(){cout<<"3";}

     virtual ~child(){cout<<"3";} 

   protected:

     something mdatamember;

 };

int main()

 {

   parent*mychild=new child;

   delete mychild;

   return 0;

 }

上面代码的执行结果是123321,完全释放了空间!

写了上面的三个代码目的只有一个,告诉大家在继承的过程中如果想释放干净空间,需要把要调用的析构函数用虚析构函数代替!

拓展:

程序在执行的过程中,虚函数是如何动态实现调用对应类的函数的!牵涉到虚函数表,感兴趣的的话可以在网上搜搜

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值