C++ 類型系統旨在防止類型錯誤,但轉型(cast)繞過編譯器檢查,可能引入難以發現的運行時錯誤。舊式轉型 (T)expr 或 T(expr) 尤其危險。
const/volatile,唯一具備此能力。nullptr 或拋出異常,有運行期開銷。若設計頻繁需要 dynamic_cast,說明繼承體系可能違反 Liskov 替換原則。嘗試:
若轉型不可避免,將其封裝在函數內部,客戶代碼調用函數而非直接轉型。
// 不好:到處散落 dynamic_cast
Derived* d = dynamic_cast(basePtr);
// 好:封裝
Derived* getDerived(Base* b) {
return dynamic_cast(b); // 單一受控位置
}
新式轉型語法醒目、語義明確、編譯器可檢查,舊式轉型在現代 C++ 中無任何優勢。
在注重效率的代碼中避免
dynamic_cast(運行期類型檢查有開銷)。若必須用,考慮緩存結果或改用靜態多態(CRTP/模板)。
static_cast、const_cast,謹慎用 dynamic_cast,極少用 reinterpret_cast。