VC6启用运行时类型识别 (RTTI)
生活随笔
收集整理的這篇文章主要介紹了
VC6启用运行时类型识别 (RTTI)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在程序中,當(dāng)我們對(duì)多態(tài)類的基類指針使用typeid,就可以在運(yùn)行時(shí)確定指針指向?qū)ο蟮膶?shí)際類型,并輸出對(duì)象類型的名字。
#include??<?cstdlib?>?#include??<?iostream?>?
#include??<?typeinfo?>?
using???namespace??std;
class??B{
public?:
?????virtual???void??fun(){}
};
class??D:?public??B{
public?:
?????void??fun(){}
};
int??main()
{
????B??*?p;
????D?ob;
????p?=&?ob;
????cout?<<?"?typeid(*p).name()=?"?<<?typeid(?*?p).name()?<<?endl;
?????if?(typeid(?*?p)?==?typeid(D))
????????cout?<<?"?typeid(*p)==typeid(D)?"?<<?endl;
????cout?<<?"?typeid(p).name()=?"?<<?typeid(p).name()?<<?endl;
?????if?(typeid(p)?==?typeid(B?*?))
????????cout?<<?"?typeid(p)==typeid(B*)?"?<<?endl;
????system(?"?pause?"?);
?????return???0?;
}
這段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并不會(huì)返回指針?biāo)赶驅(qū)ο蟮膶?shí)際類型。
如果將class B中的virtual去掉,在編譯運(yùn)行得到的結(jié)果是
typeid(*p).name()=1B
typeid(p).name()=P1B
typeid(p)==typeid(B*)
由此可見,在任何時(shí)刻都可以用基類指針指向派生類對(duì)象,而用typeid(*p)確定p指向的對(duì)象時(shí),只當(dāng)基類為多態(tài)類時(shí)才能真正確定p在運(yùn)行時(shí)指向的實(shí)際類型。
VC默認(rèn)不啟動(dòng)RTTI,即“運(yùn)行時(shí)期類型識(shí)別”,如果在你的程序用到了RTTI,比如typeid,你必須明確告訴編譯器啟動(dòng)RTTI,這樣VC才能正確編譯?
選擇菜單Project->settings->c/c++->category->c++ language,將Enable Run-Time Type Infomation(RTTI)選中?
總結(jié)
以上是生活随笔為你收集整理的VC6启用运行时类型识别 (RTTI)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于SSM+SpringBoot+MyS
- 下一篇: C++ 类访问控制(public/pro