在程序中,當(dāng)我們對多態(tài)類的基類指針使用typeid,就可以在運(yùn)行時(shí)確定指針指向?qū)ο蟮膶?shí)際類型,并輸出對象類型的名字。








































這段code在VC++6.0中編譯時(shí),提示如下
warning C4541: 'typeid' used on polymorphic type 'class B' with /GR-; unpredictable behavior may result
編譯后運(yùn)行時(shí)錯(cuò)誤。不知是不是此版本的VC++不符合C++標(biāo)準(zhǔn)?
在Devcpp(g++)中編譯運(yùn)行得到的結(jié)果是
typeid(*p).name()=1D
typeid(*p)==typeid(D)
typeid(p).name()=P1B
typeid(p)==typeid(B*)
說明用typeid作用于*p得到的的確是D類型,而用typeid作用于p得到的依然是B類的指針類型
如果typeid被作用于非多態(tài)類指針,那么我們得到的是指針被聲明的類型,也就是說,此時(shí)typeid并不會返回指針?biāo)赶驅(qū)ο蟮膶?shí)際類型。
如果將class B中的virtual去掉,在編譯運(yùn)行得到的結(jié)果是
typeid(*p).name()=1B
typeid(p).name()=P1B
typeid(p)==typeid(B*)
由此可見,在任何時(shí)刻都可以用基類指針指向派生類對象,而用typeid(*p)確定p指向的對象時(shí),只當(dāng)基類為多態(tài)類時(shí)才能真正確定p在運(yùn)行時(shí)指向的實(shí)際類型。
VC默認(rèn)不啟動RTTI,即“運(yùn)行時(shí)期類型識別”,如果在你的程序用到了RTTI,比如typeid,你必須明確告訴編譯器啟動RTTI,這樣VC才能正確編譯
選擇菜單Project->settings->c/c++->category->c++ language,將Enable Run-Time Type Infomation(RTTI)選中