C++中dynamic_cast和dynamic_pointer_cast

C++ 中提供了四种强制类型转换操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast。而关于shared_ptr 无法利用这些原始的操作符进行转换,其定义了自己的类型转换操作符:static_pointer_cast, dynamic_pointer_cast, const_pointer_cast 。

其用途跟非智能指针的cast意思相同:static cast可以用来在不相干的类型间转换,只要两个类型之间兼容,例如char 转 int

dynamic_cast 主要用来向下类型转换(基类至少有一个虚函数才行),提供能力的查询,转换失败返回空;向上类型转换可直接转,无需dynamic cast, 但是即使用了dynamic_cast也行,只不过不需要。

#include <boost/shared_ptr.hpp>
class CBase: public boost::enable_shared_from_this<CBase> 
{
public:
virtual void f(){}//必须有个虚函数才能向上向下转换。
}
typedef boost::shared_ptr<CBase> CBasePtr;
class CChild: public CBase
{}
typedef boost::shared_ptr<CChild> CChildPtr;
void main()
{
 CBasePtr ptrBase = boost::make_shared<CBase>();

 //等同于
 //CBasePtr ptrBase = CBasePtr(new CBase());


 // 向下转换
 CChildPtr ptrChild = boost::dynamic_pointer_cast<CChild>(ptrBase);


 // 向上转换
 CBasePtr ptrXXX = ptrChild;


 // 普通转换
 CChildPtr ptrXX = CChildPtr(dynamic_cast<CChild*>(ptrXXX.get()));
}

向上转型是多态的基础,不需要借助任何特殊的方法(同样适用于boost 智能指针,但向下直接转换不行,需借助于dynamic_pointer_cast,因为智能指针是两个完全不同的类型),只需用将子类的指针或引用赋给基类的指针或引用即可,当然dynamic_cast也支持向上转 型,而其总是肯定成功的。而对于向下转型和横向转型来讲,其实对于dynamic_cast并没有任何区别,它们都属于能力查询。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值