VC6启用运行时类型识别 (RTTI)
生活随笔
收集整理的這篇文章主要介紹了
VC6启用运行时类型识别 (RTTI)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在程序中,當我們對多態類的基類指針使用typeid,就可以在運行時確定指針指向對象的實際類型,并輸出對象類型的名字。
#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中編譯時,提示如下
warning C4541: 'typeid' used on polymorphic type 'class B' with /GR-; unpredictable behavior may result
編譯后運行時錯誤。不知是不是此版本的VC++不符合C++標準?
在Devcpp(g++)中編譯運行得到的結果是
typeid(*p).name()=1D
typeid(*p)==typeid(D)
typeid(p).name()=P1B
typeid(p)==typeid(B*)
說明用typeid作用于*p得到的的確是D類型,而用typeid作用于p得到的依然是B類的指針類型
如果typeid被作用于非多態類指針,那么我們得到的是指針被聲明的類型,也就是說,此時typeid并不會返回指針所指向對象的實際類型。
如果將class B中的virtual去掉,在編譯運行得到的結果是
typeid(*p).name()=1B
typeid(p).name()=P1B
typeid(p)==typeid(B*)
由此可見,在任何時刻都可以用基類指針指向派生類對象,而用typeid(*p)確定p指向的對象時,只當基類為多態類時才能真正確定p在運行時指向的實際類型。
VC默認不啟動RTTI,即“運行時期類型識別”,如果在你的程序用到了RTTI,比如typeid,你必須明確告訴編譯器啟動RTTI,這樣VC才能正確編譯?
選擇菜單Project->settings->c/c++->category->c++ language,將Enable Run-Time Type Infomation(RTTI)選中?
總結
以上是生活随笔為你收集整理的VC6启用运行时类型识别 (RTTI)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于SSM+SpringBoot+MyS
- 下一篇: 使用ffmpeg录音