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並沒有任何區別,它們都屬於能力查詢。
