dynamic cast的使用條件

2021-06-25 18:26:35 字數 1208 閱讀 2629

c++提供了兩種方式來支援rtti,dynamic_cast是其中一種,另一種是typeid()。表面上看,dynamic_cast有兩種形式:

base *pbase = new derived

();

derived *pderived = dynamic_castpbase;

base refbase = derived();

derived &refderived = dynamic_castrefbase

即dynamic_cast用於將基類的引用或指標轉化為派生類的引用或指標。但使用條件是:1、基類的指標或引用確實繫結到派生類的物件上;2、只有當基類至少含有乙個虛函式的時候才能使用dynamic_cast。原因是rtti機制依賴於虛函式表(inside c++ object model第一章給出了解釋),而dynamic_cast是rtti的一種,所以必須要有虛函式表的支援,也就是要虛類中至少有乙個虛函式。

那麼,dynamic_cast有什麼好處呢?

我們知道,基類的指標即使指向的是派生類的物件,但通過基類的指標也只能訪問到基類中包含的public成員,那如果想要訪問派生類中新增的public成員呢?這就需要將基類的的指標動態型別轉化為派生類的指標。見以下**:

#includeusing namespace std;

class base

virtual void fcn() //要有虛函式

int a;

};class derived:public base

int b;

};int main()

如何對dynamic_cast轉化是否成功進行判斷,從而選擇進行基類的操作還是進行派生類的操作呢?見下面的**:

#includeusing namespace std;

class base

virtual void fcn() //要有虛函式

int a;

};class derived:public base

int b;

};int main()else

在vs和gcc下測試過:如果bp指向的不是派生類的物件而是基類的物件的話,那麼兩種編譯器下都不能通過編譯!!!這樣的執行時動態型別判斷也就沒有意義了。這種寫法值得商榷!

如果是引用的話,當轉化不成功時會丟擲std::bad_cast異常,詳見《c++ primer》第5版p731。

C 中dynamic cast 的使用方法

分類 c 2011 12 15 14 19 5117人閱讀收藏 舉報c 編譯器iostream class object null 這是從網上摘下的例子,主要講述了 dynamic cast 的使用方法。作用 將乙個基類物件指標 或引用 cast到繼承類指標,dynamic cast會根據基類指標是...

C 中dynamic cast的使用方法

這是從網上摘下的例子,主要講述了 dynamic cast 的使用方法。作用 將乙個基類物件指標 或引用 cast到繼承類指標,dynamic cast會根據基類指標是否真正指向繼承類指標來做相應處理,即會作一定的判斷。對指標進行dynamic cast,失敗返回null,成功返回正常cast後的物...

Dynamic cast的效率問題

dynamic cast的作用 在derived class身上執行derived class 執行函式,手頭只有指向base的pointer或reference.方案一 class window class specialwindow public window 什麼也不做 class speci...