You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dynamic_cast<void*>转换非最派生类对象会发生什么?

关于dynamic_cast<void*>转换后再static_cast的行为分析

首先明确核心规则:dynamic_cast<void*>作用于多态类指针时,会返回指向底层实际对象的最派生版本起始地址的void指针。

回到你的代码最后一行:

DerivedClass* derivedPtr2 = static_cast<DerivedClass*>(dynamic_cast<void*>(basePtr_d));

这里basePtr_d指向的是一个DerivedClass类型的对象——这个对象本身就是当前场景下的「最派生对象」(因为它没有被更上层的派生类实例化,实际对象的类型就是DerivedClass)。所以dynamic_cast<void*>(basePtr_d)得到的就是这个DerivedClass对象的起始地址。

接下来用static_cast<DerivedClass*>把这个void指针转换回去,是完全合法且安全的操作:转换后得到的derivedPtr2会正确指向目标DerivedClass对象,和之前的derivedPtr效果完全一致——你可以正常调用它的dummy()方法(会输出"Derived"),也能直接访问成员变量a,不会出现未定义行为。

简单总结:这种情况和直接用dynamic_cast<DerivedClass*>(basePtr_d)的结果等价,因为底层对象本身就是DerivedClass,dynamic_cast<void*>只是拿到了它的起始地址,再转回来自然没问题。

内容的提问来源于stack exchange,提问作者o_oTurtle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:52:09