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對象。