C++ Gossip: 使用 dynamic_cast
2014-03-26 07:23
519 查看
原文链接:http://openhome.cc/Gossip/CppGossip/dynamicCast.html
您可以使用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來處理例外,例如:
執行結果:
您可以使用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> #include <typeinfo> using namespace std; class Base { public: virtual void foo() = 0; }; class Derived1 : public Base { public: void foo() { cout << "Derived1" << endl; } void showOne() { cout << "Yes! It's Derived1." << endl; } }; class Derived2 : public Base { public: void foo() { cout << "Derived2" << endl; } void showTwo() { cout << "Yes! It's Derived2." << endl; } }; void showWho(Base &base) { try { Derived1 derived1 = dynamic_cast<Derived1&>(base); derived1.showOne(); } catch(bad_cast) { cout << "bad_cast 轉型失敗" << endl; } } int main() { Derived1 derived1; Derived2 derived2; showWho(derived1); showWho(derived2); return 0; }
執行結果:
Yes! It's Derived1. bad_cast 轉型失敗 |
相关文章推荐
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析
- C++ 使用dynamic_cast进行downcast时常会出现的问题 [RTTI]
- C++ 中 dynamic_cast 使用(二)
- 转C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析
- C++中dynamic_cast、static_cast 使用说明
- C++ 使用dynamic_cast进行downcast时常会出现的问题 [RTTI]
- 【C++基础】类型转换运算符的使用方法(reinterpret_cast、 const_cast、static_cast、dynamic_cast)
- [C/C++不常见语法特性]_[使用dynamic_cast 强制转换的优点]
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- [C/C++不常见语法特性]_[使用dynamic_cast 强制转换的优点]
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。(转)
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- c++11 使用c++风格的cast: static_cast<type>(expression) const_cast<type> dynamic_cast reinterpret_cast
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterdivt_cast、和const_cast
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- c++ dynamic_cast与static_cast使用方法示例
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast