

新闻资讯
技术学院能,但仅当基类是多态类型(含虚函数)且实际指向派生类对象时才成功;否则指针返回nullptr,引用抛std::bad_cast。
能,但仅当基类对象**实际指向的是该派生类(或其子类)的实例**,且基类至少有一个虚函数(即必须是多态类型)。否则 dynamic_cast 返回 nullptr(对指针)或抛出 std::bad_cast(对引用)。
这不是“强制转换”,而是运行时类型检查后的安全向下转型(downcast)。
error: cannot dynamic_cast ... because the base class is not polymorphic
nullptr,引用抛异常dynamic_cast 依赖 RTTI(Run-Time Type Information),而 C++ 只对**多态类型**(即含虚函数的类)生成 RTTI 数据。没有虚函数的类,编译器不插入 vtable 和类型描述信息,dynamic_cast 根本无从判断真实类型。
哪怕只加一个空的虚析构函数,也足以满足要求:
立即学习“C++免费学习笔记(深入)”;
class Base {
public:
virtual ~Base() = default; // ✅ 关键:让 Base 成为多态类型
};dynamic_cast 编译不过virtual void foo() = 0;)同样有效指针版本可判空,推荐用于不确定类型的场景;引用版本无法判空,适合你**确定类型一定匹配**、想让错误尽早暴露的场合。
Base* b = new Derived(); Derived* d1 = dynamic_cast(b); // ✅ 成功,d1 指向有效对象 Derived* d2 = dynamic_cast (new Base()); // ❌ d2 == nullptr try { Derived& d3 = dynamic_cast
(b); // ✅ OK Derived& d4 = dynamic_cast ( new Base()); // ❌ 抛 std::bad_cast } catch (const std::bad_cast& e) { // 处理错误 }
nullptr 再解引用try/catch
dynamic_cast&,引用绑定到临时对象可能延长其生命周期,但逻辑上仍危险频繁使用 dynamic_cast 往往是设计信号——比如需要根据类型分
支调用不同逻辑,这通常说明应该用虚函数重构。
std::variant + std::visit(C++17)更类型安全、无 RTTI 开销typeid(*ptr).name() 更轻量,但结果不跨平台static_cast 替代 dynamic_cast 做向下转型——它跳过运行时检查,出错就是未定义行为真正需要 dynamic_cast 的典型场景很窄:比如插件系统中接收通用接口指针,需临时提取某个具体扩展能力;或调试器/序列化框架中按需还原原始类型。其他时候,它大概率是设计拐点的提示灯。