delete this的问题

本文通过两个示例深入探讨了 C++ 中析构函数的特性,包括虚析构函数如何实现动态绑定以及如何使用私有析构函数限制对象的创建方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TEST1:
#include  < iostream >
using   namespace  std;

class  Base
{
public :
    
virtual   ~ Base()
    { 
        cout 
<<   " Base dtor! "   <<  endl;
    }
};

class  Derived :  public  Base
{
private :
    
virtual   ~ Derived()
    { 
        cout 
<<   " Derived dtor! "   <<  endl;
    }
};

int  main()
{
    Derived
*  pd = new  Derived;
    
// delete pd;      // error,相当于调用pd->~Derived()
    Base *  pb = new  Derived;
    delete pb;

    
return   0 ;
}

/*
* Base的dtor可见,虽然会被virtual到Derived的dtor上去,这就是所谓的dynamic binding可以突破访问权限,其实访问权限本来就是只有在编译期起作用的,想清楚编译期和运行时其实很容易理解上面代码

*/

TEST2:
#include  < iostream >
using   namespace  std;

class  Base 

public :
    
void  destroy()  // 伪析构
    {
        cout 
<<   " DTOR " <<  endl;
        delete 
this ;
    }

private
    
~ Base() {} 
};

int  main()
{
    Base 
* pb  =   new  Base; // ok
    pb -> destroy();

    Base b;             
// error: "cannot access private member declared in class 'Base'"
    b.destroy();

    
return   0 ;
}


/*
   不论是静态的或是普通成员函数都是可以通过delete或delete this删掉这样的一个对象。
   这种私有dtor加上刚才说的伪析构的成员函数可以达到只允许new来创建对象实例,
   而不允许直接定义实例的效果。
 
*/

/* 因为b 是局部变量(auto),所以生命期末会调用析构函数,而析构函数为private */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值