|
您可以使用static_cast(甚至是傳統的C轉型方式)將基底類別指標轉換為衍生類別指標,這種轉型方式是強制轉型,在執行時期使用強制轉型有危險
性,因為編譯器無法得知轉型是否正確,執行時期真正指向的物件型態是未知的,透過簡單的檢查是避免錯誤的一種方式: if(typeid(*base)
== typeid(Derived1)) {
Derived1 *derived1 = static_cast<Derived1*>(base); derived1->showOne(); } 為了支援執行時期的型態轉換動作,C++提供了dynamic_cast用來將一個基底類別的指標轉型至衍生類別指標,稱之為「安全向下轉型」(Safe downcasting),它在執行時期進行型態轉換動作,首先會確定轉換目標與來源是否屬同一個類別階 層,接著才真正進行轉換的動作,檢驗動作在執行時期完成,如果是一個指標,則轉換成功時傳回位址,失敗的話會傳回0,如果是參考的話,轉換失敗會丟出 bad_cast例外。 可以將 執行時期型態資訊(RTTI) 中的showWho()函式如下修改: void
showWho(Base *base) {
base->foo(); if(Derived1 *derived1 = dynamic_cast<Derived1*>(base)) { derived1->showOne(); } else if(Derived2 *derived2 = static_cast<Derived2*>(base)) { derived2->showTwo(); } } 由於dynamic_cast轉換失敗的話會傳回0,因而運算的結果不可使用,必須先行對轉換結果作檢查才可以,如上例所示。 如果使用參考的話,dynamic_cast在轉換失敗之後會丟出bad_cast例外,所以您必須使用try...catch來處理例外,例如: #include <iostream> 執行結果:
|