C++推荐用static_cast和dynamic_cast进行显式类型转换:static_cast用于编译期安全转换(如基本类型、向上转型、void*互转),dynamic_cast用于多态类型的运行时安全向下转型,需虚函数支持。

C++ 中类型转换分隐式和显式两种,显式转换推荐用 static_cast 和 dynamic_cast,它们语义清晰、类型安全,比 C 风格强制转换(如 (int)x)更可靠。
static_cast:编译期检查的“常规”转换
用于已知安全、有明确定义关系的类型间转换,编译器在编译时验证是否合法,不涉及运行时开销。
- 基本类型转换:如
double→int、int→float(注意精度丢失) - 类层次中向上转型(派生类指针/引用 → 基类):总是安全,无需虚函数
- 有转换构造函数或类型转换运算符的类间转换(如
std::string→const char*不行,但自定义类可支持) - void* 与具体指针类型互转(需确保原指针确实指向该类型对象)
⚠️ 注意:static_cast 不检查向下转型(基类 → 派生类)是否真正安全,错误使用会导致未定义行为。
dynamic_cast:运行时检查的“安全向下转型”
专为多态类型设计,仅适用于含至少一个虚函数的类(即“多态类型”),转换失败时返回 nullptr(指针)或抛出 std::bad_cast(引用)。
立即学习“C++免费学习笔记(深入)”;
- 主要用途:基类指针/引用 → 派生类指针/引用(向下转型)
- 要求源对象实际类型必须是目标类型或其派生类,否则转换失败
- 只能用于指针或引用;不能用于内置类型或无虚函数的类
- 有运行时开销(需访问虚函数表和类型信息 RTTI)
示例:Base* b = new Derived; Derived* d = dynamic_cast 成功;若 b 实际指向 Base 对象,则 d 为 nullptr。
别混淆:什么时候该用哪一个?
简单判断逻辑:
- 想把
int变double,或把Derived*变Base*→ 用static_cast - 不确定基类指针实际是不是某个派生类,想“试试看”再安全使用 → 用
dynamic_cast - 需要把
void*还原回原始类型(比如从容器取数据)→ 用static_cast,但务必确保类型匹配 - 想把
Base*强转成Derived*且不关心是否安全 →static_cast可能编译通过但危险;应优先考虑dynamic_cast+ 判空
不推荐的替代方式
C 风格转换((T)x)和 const_cast/reinterpret_cast 有特定用途,但日常开发中应避免滥用。尤其 reinterpret_cast 绕过类型系统,极易引发未定义行为;const_cast 仅用于移除 const 性质,且修改原 const 对象仍是未定义行为。










