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并没有任何区别,它们都属于能力查询。