虚析构函数和析构函数中的虚机制

虚析构函数:

       虚析构函数是为了解决基类指针指向派生类对象,并用基类指针删除派生类对象时能够完全释放内存。

        class A1{

            public:

             ~A1(){cout<<"A1"<<endl;}

};

       class A2{

           public:
                virtual ~A2(){cout<<"A2"<<endl;}

} ;

       class B1:public A1{

            public:

                ~B1(){cout<<"B1"<<endl;}

};

      class B2:public A2{

             public:

                 ~B2(){cout<<"B2"<<endl;}

};

       int main(){

       A1* a1=new B1;

       A2* a2=new B2;

       delete a1;  //调用基类析构函数,显示:A1(派生类并没有被删除)

       delete a2;  //先调用派生类析构函数,再调用基类虚析构函数。显示:B2 A2

       return 0;

}


一般来说,如果类中不包含虚函数,就表示这个类不作为基类使用。


如果声明纯虚的析构函数,则必须为纯虚析构函数提供一个函数体。纯虚析构函数的作用是可以使基类成为一个抽象类,不能创建基类对象。



析构函数的虚机制:


对于在析构函数中调用虚函数,则虚函数机制将被忽略,即只调用本地版本。如果虚机制存在。则析构函数从派生类到基类按层次调用,可能会出现被调用的函数操作在已经被删除的对象上。(例如基类析构函数中的虚函数调用派生类版本,此时派生类已经被删除)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值