介紹
dynamic_cast運算符它涉及到編譯器的屬性設定,而且牽扯到的面向對象的多態性跟程式運行時的狀態也有關係,所以不能完全的使用傳統的轉換方式來替代。但是也因此它是最常用,最不可缺少的一個運算符。
與static_cast一樣,dynamic_cast的轉換也需要目標類型和源對象有一定的關係:繼承關係。 更準確的說,dynamic_cast是用來檢查兩者是否有繼承關係。因此該運算符實際上只接受基於類對象的指針和引用的類轉換。從這個方面來看,似乎dynamic_cast又和
reinterpret_cast是一致的,但實際上,它們還是存在著很大的差別。
語法
dynamic_cast <新類型> (表達式)。
用法
該運算符把expression轉換成type-id類型的對象。Type-id 必須是類的
指針、類的引用或者
void*;
如果 type-id 是類指針類型,那么expression也必須是一個指針,如果 type-id 是一個引用,那么 expression 也必須是一個引用。
dynamic_cast
運算符可以在執行期決定真正的類型。如果 downcast 是安全的(也就說,如果基類指針或者引用確實指向一個
派生類對象)這個運算符會傳回適當轉型過的指針。如果 downcast 不安全,這個運算符會傳回空
指針(也就是說,基類指針或者引用沒有指向一個派生類對象)。
dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。
在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;
在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全。
classB{public:int m_iNum;virtual void foo();};classD:publicB{public:char* m_szName[100];};void func(B* pb){D* pd1=static_cast<D*>(pb);D* pd2=dynamic_cast<D*>(pb);}
在上面的
代碼段中,如果 pb 指向一個 D 類型的對象,pd1 和 pd2 是一樣的,並且對這兩個
指針執行 D 類型的任何操作都是安全的;但是,如果 pb 指向的是一個 B 類型的對象,那么 pd1 將是一個指向該對象的指針,對它進行 D 類型的操作將是不安全的(如訪問 m_szName),而 pd2 將是一個空指針。