dynamic_cast

dynamic_cast

將一個基類對象指針(或引用)cast到繼承類指針,dynamic_cast會根據基類指針是否真正指向繼承類指針來做相應處理

基本介紹

  • 外文名:dynamic_cast
  • 特點:可以在執行期決定真正的類型
  • 用途:類層次間的上行轉換和下行轉換
  • 性質運算符
用法,交叉轉換,運用實例,問題,實例,

用法

dynamic_cast <type-id> (expression)
該運算符把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 將是一個空指針。
另外要注意:B 要有虛函式,否則會編譯出錯;static_cast則沒有這個限制。
這是由於運行時類型檢查需要運行時類型信息,而這個信息存儲在類的虛函式表(關於虛函式表的概念,詳細可見<Inside c++ object model>)中,只有定義了虛函式的類才有虛函式表,沒有定義虛函式的類是沒有虛函式表的。

交叉轉換

另外,dynamic_cast還支持交叉轉換(cross cast)。如下代碼所示:
classA{public:intm_iNum;virtual void f(){}};class B:public A{};class D:public A{};void foo(){B*pb=new B;pb->m_iNum=100;//D*pd1=static_cast<D*>(pb);//compile errorD*pd2=dynamic_cast<D*>(pb);//pd2isNULLdelete pb;}

相關詞條

熱門詞條

聯絡我們