18.2.2 typeid操作符
如果表達式的類型是類類型且該類包含一個或多個虛函數,則表達式的動態類型可能不同於它的靜態編譯時類型。例如,如果表達式對基類指針解引用,則該表達式的靜態編譯時類型是基類類型;但是指針實際指向派生類對象,則typeid操作符將說表達式的類型是派生類型。
typeid操作符可以與任何類型的表達式一起使用。內置類型的表達式以及常量都可以用作typeid操作符的操作數。如果操作數不是類類型或者是沒有虛函數的類,則typeid操作符指出操作數的靜態類型;如果操作數是定義了至少一個虛函數的類類型,則在運行時計算類型。
使用typeid操作符
typeid最常見的用於是比較兩個表達式的類型,或者將表達式的類型與特定類型相比較。
Base1 *bp=new Base1();
Child1 *cp=new Child1();
if(typeid(*bp)==typeid(*cp)){
}
if(typeid(*cp)==typeid(Child1)){
}
Base1 *bp=new Base1();
Child1 *cp=new Child1();
if(typeid(*bp)==typeid(*cp)){
}
if(typeid(*cp)==typeid(Child1)){
}只有當typeid的操作數是帶虛函數的類類型的對象的時候,才返回動態類型信息。測試指針(相對於指針指向的對象)返回指針的靜態的、編譯時類型。
如果指針p的值是0,那麼,如果p的類型是帶虛函數的類型,則typeid(*p)拋出一個bad_typeid異常;如果p的類型沒有定義任何虛函數,則結果與p的值是不相關的。
摘自 xufei96的專欄