fun1函式使用強制型別轉換將pb轉換為a*或c*,看出什麼的問題了嗎?class a;
class b:public a;
class c:public b;
void fun1(b* pb)
如果這樣呼叫fun1:
fun1(((b*)new c));
的確不會有問題,但如果是這樣呢:
fun1(new b);
pc不會為null,能夠想到使用pc指標時就程式就悲劇了.
更嚴重情況下,如果是這樣:
fun1((b*)0x00005678);//0x00005678是乙個隨機值
pa,pc就不會是null,強制型別轉換總是能夠成功的,但使用這兩個指標時程式肯定崩潰.當然你可以使用異常處理機制來處理這樣的錯誤,不過這有點大才小用的感覺,最好能夠找到一種能夠檢查出型別轉換能否成功的辦法.這時dynamic_cast就能大顯身手了.
a* pa = dynamic_castpb;// upcast.
if (null == pa)
c* pc = dynamic_castpb;// downcast.
if (null == pc)
dynamic_cast的具體作用這裡不詳細解釋,僅僅拋磚引玉做一點說明.這裡假設:
dynamic_cast < objecttype-id* > ( objecttype*)
如果要成功地將objecttype*轉換為objecttype-id*,則必須存在這種可能性才可以,也就是說objecttype*指向的物件要"包含"objecttype-id*指向的物件,如此才能夠成功.就上面的例子來說,c物件"包含"b物件,而b物件"包含"a物件,如果:
a* pa = new b;
那麼b* pb = dynamic_castpa;// ok.
c* pc = dynamic_castpa;// fail.
如果說你不能確定這種包含關係,最好使用dynamic_cast.
實際上可以把dynamic_cast看做是強制型別轉換的乙個子集,看成是更嚴格檢查的強制型別轉換,因為"更嚴格"所以能夠檢查出來錯誤.
最後提一點,使用dynamic_cast,不要忘了編譯選項gr.
dynamic cast的使用條件
c 提供了兩種方式來支援rtti,dynamic cast是其中一種,另一種是typeid 表面上看,dynamic cast有兩種形式 base pbase new derived derived pderived dynamic castpbase base refbase derived de...
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後的物...