C 風格強轉 (Type)expr 在 C++ 中不推薦,因功能混雜、易出錯。C++ 提供四個具名轉換運算符:static_cast、dynamic_cast、const_cast、reinterpret_cast。本文詳解前兩者。
static_cast(expr)
int → double、float → int 等。void* → int*(C 中隱式,C++ 需顯式)。static_cast(cstr) 。class Base {}; class Derived : public Base {};
Derived* d = new Derived();
Base* b = static_cast (d); // 向上,安全
Derived* d2 = static_cast(b); // 向下,若 b 真指向 Derived 則安全,否則 UB
int i = 42;
double x = static_cast(i); // 基本類型
void* p = &i;
int* pi = static_cast(p); // void* 轉換
dynamic_cast(expr)
Type 必須是**類指針、類引用或 void\***。expr 必須是多態類型(即類有虛函數)的指針/引用。dynamic_cast(ptr) 返回最派生對象地址。class Base { virtual ~Base() {} }; // 必須多態
class Derived : public Base {};
Base* b = new Derived();
Derived* d = dynamic_cast(b); // 成功,非 nullptr
Base* b2 = new Base();
Derived* d2 = dynamic_cast(b2); // 失敗,返回 nullptr
// 引用版本
try {
Derived& ref = dynamic_cast(*b2); // 拋 bad_cast
} catch (bad_cast&) { /* 處理 */ }
| 特性 | static_cast | dynamic_cast |
|---|---|---|
| 運行時檢查 | 無 | 有(RTTI) |
| 向下轉型安全性 | 不保證,UB 風險 | 安全,失敗返回 nullptr |
| 性能 | 極快(編譯期) | 稍慢(運行時查虛表) |
| 要求 | 類型相關或基本類型 | 源類型必須多態(有虛函數) |
| 適用場景 | 確定類型轉換、基本類型、void* | 不確定具體類型、插件架構、橫向轉型 |
static_cast,明確類型關係時。dynamic_cast(配合虛函數)。reinterpret_cast 除非極低層位操作。-fno-rtti)可減小體積,但 dynamic_cast 將不可用。