歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C/C++ 設計模式:關於使用typeid時要注意的問題

typeid可以獲取到一個對象或引用的確切類型,這在多態編程下非常有用。
要使用typeid,首先確保你的編譯器開啟了運行時類型檢查(RTTI)。

在visual studio中
打開該項目的"屬性頁" -> "C/C++" -> "語言"
修改"啟用運行時類型信息"屬性為是即可

今天在測試typeid的使用時,寫了小段代碼測試

  1. class Base {};  
  2. class Derived : public Base {};  
  3. int main()  
  4. {  
  5.     Derived d;  
  6.     Base& b = d;  
  7.     cout << typeid(b).name() << endl;  
  8. }  

最終輸出的卻是"class Base",而不是正確的"class Derived"(不同編譯器輸出的內容可能不一樣)
原因是Base類沒有定義任何虛函數,所以對於編譯器來說
Base類和Derived類之間的轉換沒有任何意義,因為你不能通過基類指針或引用調用到派生類的函數
所以動態類型檢測不會將
Base& b = d;
中的b當成Derived類處理了

稍加改動

  1. class Base   
  2. {  
  3. public:  
  4.     virtual ~Base() {}  
  5. };  
  6. class Derived : public Base {};  
  7. int main()  
  8. {  
  9.     Derived d;  
  10.     Base& b = d;  
  11.     cout << typeid(b).name() << endl;  
  12. }  

輸出的就是正確的"class Derived"

另外還要注意的就是typeid作用於指針時,因為這往往是錯誤的
還是上面那個例子

  1. Base *b = new Derived;  
  2. cout << boolalpha << (typeid(b) == typeid(Derived)) << endl;  

輸出的是false

使用時應該先解引用,即

  1. cout << boolalpha << (typeid(*b) == typeid(Derived)) << endl;  

輸出即為true

由於網上很多關於typeid的文章都沒有提到這兩點
所以這裡整理下在多態下使用typeid時要注意的問題,希望大家使用時注意下
1.確保基類定義了至少一個虛函數

2.不要將typeid作用於指針,應該作用於引用

3.typeid是一個運算符,而不是函數

4.typeid運算符返回的type_info類型,其拷貝構造函數和賦值運算函數都聲明為private了,這意味著其不能用於stl容易,所以我們一般不能不直接保存type_info信息,而保存type_info的name信息。

Copyright © Linux教程網 All Rights Reserved