程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> dynamic_cast和static_cast的區別

dynamic_cast和static_cast的區別

編輯:C++入門知識

  在C++中,dynamic_cast和static_cast都是用來轉型的操作符,兩者不合理的運用可能會導致在編譯期合法的類型轉換操作卻在運行期也會引發錯誤,當轉型操作涉及到對象指針或引用時,更易發生錯誤。 這兩者又有什麼區別呢?

  1、dynamic_cast操作符會在運行期對可疑的轉型操作進行安全檢查,而static_cast操作符不會進行安全檢查;

  2、dynamic_cast僅對多態有效(轉型的源類型必須是多態,但與轉型的目標類型是否多態無關),而static_cast可施加與任何類型;

  3、從派生類到基類的 dynamic_cast 可以進行,這稱為向上轉型;

  4、從基類到派生類的 dynamic_cast 不能進行,稱為向下轉型;

  5、有繼承關系,派生類可通過dynamic_cast向基類轉換;

  6、沒有繼承關系,不能通過dynamic_cast互換;

  使用方式:

  dynamic_cast<T*>ptr、static_cast<T*>ptr;

  dynamic_cast<T&>p、static_cast<T*>p;

  下面用一些簡單的代碼來說明關於轉型的一些知識點:

  一個基類指針不經過明確的轉型操作,就能指向基類對象或派生類對象;反過來,一個派生類指針指向基類對象是一種不明智的做法。

      D :           D*     p =  B();                  
     p = static_cast<D*>( B()); 
 }

  再看下面一段代碼:

            f() { cout<< <<    D :           m(){cout<< <<          D* p = static_cast<D*>(       p ->          }

  其中p->m()編譯能通過,但運行出錯。因為P實際指向一個B的對象,而B沒有成員函數m,這種轉型不安全(在VS2010中,可正確運行,輸出:m())。

  C++提供的dynamic_cast操作符可以在運行期檢測某個轉型動作是否安全。dynamic_cast和static_cast有同樣的語法,不過dynamic_cast僅對多態類型有效。

        
             T* p = dynamic_cast<T*>( C());  
         }

  注意:dynamic_cast操作正確的前提是——轉型的源類型必須是多態的, 但與轉型的目標類型是否多態無關。 在<>中指定的dynamic_cast的目的類型必須是一個指針或引用。

  看一個正確的用法:

             f() {cout <<  <<   D:           m() {cout <<  <<          D* p = dynamic_cast<D*>(                     p ->         
            cout << “Error\n
          }

  若有不對或不全的歡迎指正和補充——

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved