- 概念
- 在C++中,
dynamic_cast
是一種執行時型別轉換運算子。它主要用於在類的層次結構中進行安全的向下轉換(將基類指標或引用轉換為派生類指標或引用)。這種轉換基於物件的實際型別進行檢查,以確保轉換的安全性。
- 在C++中,
- 使用條件
- 為了使用
dynamic_cast
,類層次結構中必須包含虛擬函式。這是因為dynamic_cast
依賴於執行時型別資訊(RTTI - Runtime Type Information),而虛擬函式機制是C++中實現RTTI的基礎。
- 為了使用
- 語法示例
- 指標型別轉換
- 假設有一個基類
Base
(至少包含一個虛擬函式)和一個派生類Derived
:class Base { virtual void someVirtualFunction() {} }; class Derived : public Base {}; int main() { Base* basePtr = new Derived(); Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); if (derivedPtr!= nullptr) { // 轉換成功,可以安全地使用derivedPtr指向的物件 } else { // 轉換失敗,說明basePtr實際指向的不是Derived型別的物件 } return 0; }
- 假設有一個基類
- 引用型別轉換
- 同樣對於上述的類層次結構:
int main() { Base baseObj = Derived(); try { Derived& derivedRef = dynamic_cast<Derived&>(baseObj); // 轉換成功,可以安全地使用derivedRef引用的物件 } catch (std::bad_cast& e) { // 轉換失敗,捕獲std::bad_cast異常 std::cerr << "Dynamic cast failed: " << e.what() << std::endl; } return 0; }
- 同樣對於上述的類層次結構:
- 指標型別轉換
- 特點
- 執行時檢查
- 與
static_cast
不同,dynamic_cast
在執行時檢查轉換的有效性。這意味著它會根據物件的實際型別來判斷轉換是否可行。如果轉換失敗,對於指標型別會返回nullptr
,對於引用型別會丟擲std::bad_cast
異常。
- 與
- 效能開銷
- 由於
dynamic_cast
需要在執行時查詢物件的型別資訊,這會帶來一定的效能開銷。這種開銷主要源於對虛擬函式表(vtable)的查詢以及型別資訊的判斷操作。
- 由於
- 執行時檢查
- 應用場景
- 多型性相關操作
- 在處理多型物件時,如果需要根據物件的實際派生型別進行特定操作,
dynamic_cast
就非常有用。例如,在一個圖形繪製系統中,有一個基類Shape
,派生類有Circle
、Rectangle
等。當處理一個Shape
指標陣列時,可以使用dynamic_cast
來確定每個元素實際指向的派生類物件,從而呼叫相應的派生類特定繪製函式。
- 在處理多型物件時,如果需要根據物件的實際派生型別進行特定操作,
- 避免不安全的向下轉換
- 在類層次結構中,如果不確定基類指標或引用實際指向的物件型別,直接進行向下轉換是不安全的。
dynamic_cast
提供了一種安全的方式來進行這種轉換,透過執行時檢查避免了對不適當物件進行錯誤的操作。
- 在類層次結構中,如果不確定基類指標或引用實際指向的物件型別,直接進行向下轉換是不安全的。
- 多型性相關操作
C++ 動態型別轉換
相關文章
- c++ 型別轉換C++型別
- C++ 常型別轉換C++型別
- 【C++】C++之型別轉換C++型別
- C++ 型別轉換(conv.)C++型別
- C++強制型別轉換C++型別
- C++整理18_型別轉換_C++型別
- C++ 重解釋型別轉換C++型別
- C C++ 強制型別轉換C++型別
- C++型別轉換建構函式C++型別函式
- C++ 表示式中的型別轉換C++型別
- c++ static_cast顯式型別轉換C++AST型別
- c++隱式型別轉換存在的陷阱C++型別
- 型別轉換型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- C++ const void * 型別轉換簡單測試C++型別
- 聊聊 C++ 中的四種型別轉換符C++型別
- 徹底理解c++的隱式型別轉換C++型別
- 資料型別,型別轉換資料型別
- Java資料型別自動轉換(++ ,+=)Java資料型別
- js型別轉換JS型別
- 型別轉換(cast)型別AST
- Convert型別轉換型別
- C++四種顯式型別轉換操作符C++型別
- Java資料型別及型別轉換Java資料型別
- JNI常用型別轉換型別
- 容器,型別轉換。List。型別
- interface{} 型別的轉換型別
- 型別轉換注意點型別
- 變數型別轉換變數型別
- Spring型別轉換(Converter)Spring型別
- 資料型別轉換資料型別
- golang的型別轉換Golang型別
- 型別轉換運算子型別
- C# 型別轉換C#型別
- 型別轉換工具類型別
- 強制型別轉換型別
- go interface{}型別轉換Go型別
- java基本資料型別與自動轉換Java資料型別