使用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
相关产品推荐
相关产品推荐

