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