安全的向下类型转换必须使用 dynamic_cast,且要求类为多态类型(含虚函数);对指针失败返回 nullptr,对引用失败抛 std::bad_cast 异常;需检查空指针或捕获异常,禁止使用 static_cast 或 C 风格转换。
在 C++ 中,安全的向下类型转换必须依赖 dynamic_cast,且仅适用于**多态类型**(即含有至少一个虚函数的类)。它会在运行时检查转换是否合法,失败时返回空指针(对指针)或抛出 std::bad_cast 异常(对引用),从而避免未定义行为。
dynamic_cast 要求源类型(基类)至少有一个虚函数(通常是虚析构函数),否则编译失败。
virtual ~Base() = default;
转换指针时,失败返回 nullptr,需显式判断:
Derived* d = dynamic_cast(base_ptr); d != nullptr,说明 base_ptr 实际指向 Derived 或其派生类对象引用无法为空,所以失败时抛出 std::bad_cast:
try { Derived& d = dynamic_cast(*base_ref); /* 安全使用 d */ } catch (const std::bad_cast& e) { /* 处理转换失败 */ }static_cast 和 C 风格转换((Derived*)ptr)在向下转换时不做运行时检查,若实际类型不符,结果是未定义行为 —— 可能读写错误内存、崩溃或静默错误。
因性能顾虑放弃安全性