C++ TypeId简介与使用
簡(jiǎn)介
TypeId?返回一個(gè)變量或數(shù)據(jù)類(lèi)型的“類(lèi)型”。
使用場(chǎng)景
用法如下:
????cout<<typeid(int).name()<<endl;????int?a;cout<<typeid(a).name()<<endl;輸出如下:
int
int
注意事項(xiàng)
如果有類(lèi)A,且有虛函數(shù),類(lèi)B,C,D都是從類(lèi)A派生的,且都重定義了類(lèi)A中的虛函數(shù),這時(shí)有類(lèi)A的指針p,再把對(duì)象類(lèi)B的對(duì)象的地址賦給指針p,則typeid(p).name()將返回的類(lèi)型將是A*,?因?yàn)檫@里的p表示的是一個(gè)指針,該指針是類(lèi)型為A的指針,?所以返回A*,?而typeid(*p).name()將返回B,因?yàn)橹羔?/span>p是指向類(lèi)B的對(duì)象的,而*p就表示的是類(lèi)B的對(duì)象的類(lèi)型,所以返回B。
比如有類(lèi)?A,其中定義有虛函數(shù),而類(lèi)B,C,D都是從類(lèi)A派生而來(lái)的且重定義了該虛函數(shù),這時(shí)有個(gè)類(lèi)A的指針p和p1,按照虛函數(shù)的原理,基類(lèi)的指針可以指向任何派生類(lèi)的對(duì)象,在這時(shí)就有可能需要比較兩個(gè)指針是否指向同一個(gè)對(duì)象,這時(shí)就可以這樣使用typeid了,typeid(*p)= =typeid(*p1);這里要注意的是typeid(*p)與typeid(p)是指的不同的對(duì)象類(lèi)型,typeid(p)表示的是p的類(lèi)型,在這里p是一個(gè)指針,這個(gè)指針指向的是類(lèi)A的對(duì)象,所以p的類(lèi)型是A*,?而typeid(*p)則不一樣,?*p表示的是指針p實(shí)際所指的對(duì)象的類(lèi)型,?比如這里的指針p指向派生類(lèi)B,則typeid(*p)的類(lèi)型為B。所以在測(cè)試兩個(gè)指針的類(lèi)型是否是相等時(shí)應(yīng)使用*p,即typeid(*p)= =typeid(*p1)。如果是typeid(p)= =typeid(p1)的話,則無(wú)論指針p和p1指向的什么派生類(lèi)對(duì)象,他們都是相等的,因?yàn)槎际?/span>A *的類(lèi)型。
?
相關(guān)文獻(xiàn)和資料
?? ?關(guān)于typeid的錯(cuò)誤(warning C4541: 'typeid' used on polymorphic type 'class A' with /GR-; unpredictable behavior may result):
????解決方法:在vc6中. Project - settings... - C/C++?,在Category那里選?C++ Language,再在下邊勾上?Enable Run-Time Type Information[RTTI]。這樣再運(yùn)行程序的時(shí)候就不會(huì)有錯(cuò)誤了。
????????RTTI(運(yùn)行時(shí)類(lèi)型信息)會(huì)帶來(lái)額外的開(kāi)銷(xiāo),大部分編譯器都支持RTTI,但在默認(rèn)情況下關(guān)閉此功能,需要用上面的方法打開(kāi)RTTI開(kāi)關(guān)。
轉(zhuǎn)載于:https://blog.51cto.com/844133395/1883243
總結(jié)
以上是生活随笔為你收集整理的C++ TypeId简介与使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java打印整数的二进制表示(代码与解析
- 下一篇: s3c2440移植MQTT