通八洲科技

C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换

日期:2026-01-02 00:00 / 作者:穿越時空
static_cast在编译时进行类型转换,适用于已知安全的场景如基本类型转换和向上转型,无运行时开销;dynamic_cast在运行时检查,用于多态类型的向下转型,安全性高但性能开销大。

static_castdynamic_cast 是 C++ 中两种不同的类型转换操作符,它们在用途、机制和安全性方面有明显区别。理解它们的差异对于编写安全、高效的 C++ 代码非常重要。

static_cast:静态转换(编译时确定)

static_cast 在编译阶段执行类型转换,不进行运行时类型检查。它适用于已知安全的转换场景。

常见用途包括:

例如:

Derived* d = new Derived();
Base* b = static_cast(d); // 安全,向上转型

注意:static_cast 不检查向下转型(down-cast)是否安全。如果错误地将一个实际不是派生类的基类指针转为派生类指针,结果是未定义行为。

立即学习“C++免费学习笔记(深入)”;

dynamic_cast:动态转换(运行时检查)

dynamic_cast 主要用于在继承体系中进行安全的向下转型或交叉转换,它依赖运行时类型信息(RTTI)来验证转换的合法性。

特点包括:

例如:

Base* b = new Base();
Derived* d = dynamic_cast(b);
if (d) { /* 转换成功 */ } else { /* 转换失败 */ }

只有当基类有虚函数时,才能使用 dynamic_cast。它确保了类型安全,适合在不确定对象真实类型时使用。

关键区别总结

一般建议:能用 static_cast 的安全上转型就用它;需要向下转型且不确定类型时,使用 dynamic_cast 来保证安全。