歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C/C++ 設計模式:關於使用typeid時要注意的問題

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

日期:2017/3/1 10:12:14   编辑:Linux編程

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