boost 智能指针之继承 dynamic_pointer_cast


http://greatverve.cnblogs.com/p/smart-ptr.html

http://www.cnblogs.com/my_life/articles/4153183.html

http://www.cplusplus.com/reference/memory/static_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并没有任何区别,它们都属于能力查询。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM