C++多态与dynamic_cast疑问:为何child>parent>child可行而parent>child不行?
关于C++多态与dynamic_cast类型转换的疑问解答
核心结论
dynamic_cast的转换是否成功,完全取决于指针/引用实际指向的对象类型,而非指针本身的静态类型。类具备多态性(包含虚函数)只是让dynamic_cast能在运行时做类型检查的前提,不代表任意父类转子类的操作都合法。
两种场景的具体分析
1. child→parent→child 转换可行的原因
Child* chd1 = new Child; Parent* prt1 = dynamic_cast<Parent*>(chd1); Child* chd2 = dynamic_cast<Child*>(prt1);
这里chd1指向的是一个真正的Child类型对象。即使把它转换为Parent类型的prt1,prt1底层依然指向Child实例。dynamic_cast会在运行时通过虚函数表识别出实际对象的类型是Child,因此把prt1转回Child时,能正确定位到对象的Child部分,转换自然成功。
2. parent→child 转换失败的原因
Parent* prt2 = new Parent; Child* chd3 = dynamic_cast<Child*>(prt2);
这里prt2指向的是一个纯Parent类型对象,它的内存布局里根本没有Child类的成员和虚函数表信息。dynamic_cast在运行时检测到实际对象类型与目标类型(Child)不匹配,为了避免非法内存访问,直接返回nullptr。
关键误区纠正
你之前认为“只要类具备多态性,父类转子类的dynamic_cast就正常执行”是错误的。多态性只是提供了运行时类型检查的基础,转换成功的必要条件是:父类指针/引用实际指向的是子类类型的对象。
内容的提问来源于stack exchange,提问作者thecharlesman
相关产品推荐
相关产品推荐

