C++中的RTTI與dynamic_cast static_cast

C++中多態的存在導致一個類型的真實類型無法確切知曉,於是RTTI(runtime Type Identification)機制應運而生。

在生成類對象模型的時候,我們會發現多了一個type_info的一項,這個便是爲了方便RTTI機制確認類型所用的。

關鍵字typeid()運算符,它以一個對象或者類型名作爲參數,返回一個匹配的const type_info對象,標明該對象的確切類型,和sizeof()一樣是c++語言直接支持的。

  例:if(typeid(device)==typeid(Television))其中Television是device的派生類。


當然這裏的typeid同樣可以用來檢索非多態類型對象和基本數據類型對象的類型信息,只不過此時它不會去檢索對象的vptr甚至vtable。


dynamic_cast<>運算符和static_cast<>運算符的區別:

其中static_cast是相當於c的強制類型轉換,用起來可能有一點危險。dynamic_cast如果轉換成引用出錯的話,就會出現異常,這裏需要做一個異常處理的機制。轉換指針出錯返回null。

dynamic_cast:

  支持來兩個方向上的轉換upcast和downcast.

第一種:支持由派生類的指針或引用向基類型的指針或應用。雖然這種方式可以隱式轉化得到。

第二種:如果基類指針或引用實質上指向的便是派生類對象則轉換便能成功,否則失敗,返回NULL。



RTTi由於它的方便也同時帶來了相應的副作用,不僅在執行速度上而且在程序體積上都帶來了額外的開銷。因爲他需要額外的內存來存放type_info對象。




發佈了35 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章