RTTI機制
C++是一種靜態(tài)類型語言。其數(shù)據(jù)類型是在編譯期就確定的,不能在運行時更改。然而由于面向?qū)ο蟪绦蛟O(shè)計中多態(tài)性的要求,C++中的指針或引用(Reference)本身的類型,可能與它實際代表(指向或引用)的類型并不一致。有時我們需要將一個多態(tài)指針轉(zhuǎn)換為其實際指向?qū)ο蟮念愋?,就需要知道運行時的類型信息,于是產(chǎn)生了運行時類型識別的要求。C++要想獲得運行時類型信息,可以通過RTTI機制。RTTI(Run Time Type Identification)即通過運行時類型識別,程序能夠通過基類的指針或引用獲知這些指針或引用所指的對象的實際派生類型。本來基類指針的作用就是使代碼能夠獲得一個統(tǒng)一的接口,現(xiàn)在要逆過來,通過這個基類指針來知道它的實際派生類型,即通過一堆if來判斷。RTTI提供了兩個非常有用的操作符:typeid 和 dynamic_cast:
typeid:返回指針或引用所指對象的實際類型。它返回一個對type_info類對象的引用,要使用typeid必須使用頭文件<typeinfo>。對非引用類型,typeid是在編譯時期識別的,只有引用類型才會在運行時識別。運行時獲知變量類型名稱,可以使用 typeid(變量).name(),需要注意不是所有編譯器都輸出"int"、"float"等之類的名稱,對于這類的編譯器可以這樣使用:
下面舉一個例子:
dynamic_cast:只能用于含有虛函數(shù)的類轉(zhuǎn)換,用于類向上和向下轉(zhuǎn)換。dynamic_cast可以做類之間上下轉(zhuǎn)換,轉(zhuǎn)換的時候會進行類型檢查,類型相等成功轉(zhuǎn)換,類型不等
轉(zhuǎn)換失敗。運用RTTI技術(shù),RTTI是”Runtime Type Information”的縮寫,意思是運行時類型信息,它提供了運行時確定對象類型的方法。在c++層面主要體現(xiàn)在dynamic_cast和typeid。將一個基類對象指針(或引用)轉(zhuǎn)換到繼承類指針,dynamic_cast會根據(jù)基類指針是否真正指向繼承類指針來做相應(yīng)處理。如果一條dynamic_cast語句的轉(zhuǎn)換目標是指針類型并且轉(zhuǎn)換失敗了,會返回一個空指針。如果基類或者子類沒有任何虛函數(shù)(如果基類有虛函數(shù)表,子類當然是自動繼承了該表),當他們作為dynamic_cast的源類型進行轉(zhuǎn)換時,編譯會失敗。