首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ static_cast 與 dynamic_cast 完整用法指南

     編輯:關於C++

背景

C 風格強轉 (Type)expr 在 C++ 中不推薦,因功能混雜、易出錯。C++ 提供四個具名轉換運算符:static_cast、dynamic_cast、const_cast、reinterpret_cast。本文詳解前兩者。

static_cast

語法

static_cast(expr)

用途

  1. 類層次向上轉型:子類指針/引用 → 基類指針/引用(**安全**,隱式也可)。
  2. 類層次向下轉型:基類指針/引用 → 子類指針/引用(**無運行時檢查,程序員自擔風險**)。
  3. 基本類型轉換:int → double、float → int 等。
  4. void* → 具體指針:void* → int*(C 中隱式,C++ 需顯式)。
  5. 調用顯式構造函數: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

語法

dynamic_cast(expr)

條件

  • Type 必須是**類指針、類引用或 void\***。
  • expr 必須是多態類型(即類有虛函數)的指針/引用。
  • 運行時檢查對象真實類型,**失敗返回 nullptr(指針)或拋 bad_cast(引用)**。

用途

  1. 安全向下轉型:基類指針/引用 → 子類指針/引用,**有運行時類型檢查(RTTI)**。
  2. 橫向轉型:多重繼承中兄弟類指針互轉。
  3. void* 通用轉換: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_castdynamic_cast
運行時檢查無有(RTTI)
向下轉型安全性不保證,UB 風險安全,失敗返回 nullptr
性能極快(編譯期)稍慢(運行時查虛表)
要求類型相關或基本類型源類型必須多態(有虛函數)
適用場景確定類型轉換、基本類型、void*不確定具體類型、插件架構、橫向轉型

最佳實踐

  1. 優先用 static_cast,明確類型關係時。
  2. 需運行時判斷類型時用 dynamic_cast(配合虛函數)。
  3. 避免 reinterpret_cast 除非極低層位操作。
  4. 關閉 RTTI(-fno-rtti)可減小體積,但 dynamic_cast 將不可用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved