C++中的typeid關鍵字

峻峰飛陽發表於2016-05-05

用以返回一個變數或資料型別的“型別”。

用法如下:

cout<<typeid(int).name()<<endl;

int a;

cout<<typeid(a).name()<<endl;

輸出如下:

int

int

如果有類A,且有虛擬函式,類B,C,D都是從類A派生的,且都重定義了類A中的虛擬函式,這時有類A的指標p,再把物件類B的物件的地址賦給指標p,則typeid(p).name()將返回的型別將是A*, 因為這裡的p表示的是一個指標, 該指標是型別為A的指標, 所以返回A*, 而typeid(*p).name()將返回B,因為指標p是指向類B的物件的,而*p就表示的是類B的物件的型別,所以返回B。

比如有類 A,其中定義有虛擬函式,而類B,C,D都是從類A派生而來的且重定義了該虛擬函式,這時有個類A的指標p和p1,按照虛擬函式的原理,基類的指標可以指向任何派生類的物件,在這時就有可能需要比較兩個指標是否指向同一個物件,這時就可以這樣使用typeid了,typeid(*p)= =typeid(*p1);這裡要注意的是typeid(*p)typeid(p)是指的不同的物件型別,typeid(p)表示的是p的型別,在這裡p是一個指標,這個指標指向的是類A的物件,所以p的型別是A*typeid(*p)則不一樣, *p表示的是指標p實際所指的物件的型別, 比如這裡的指標p指向派生類B,則typeid(*p)的型別為B。所以在測試兩個指標的型別是否是相等時應使用*p,即typeid(*p)= =typeid(*p1)。如果是typeid(p)= =typeid(p1)的話,則無論指標p和p1指向的什麼派生類物件,他們都是相等的,因為都是A *的型別。

 

 

    關於typeid的錯誤(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]。這樣再執行程式的時候就不會有錯誤了。

RTTI(執行時型別資訊)會帶來額外的開銷,大部分編譯器都支援RTTI,但在預設情況下關閉此功能,需要用上面的方法開啟RTTI開關。


(原文地址: http://blog.csdn.net/goodlixueyong/article/details/6244303)

相關文章