UE自定义FSavedMove_Character子类无法转换为FSavedMovePtr的问题
解决Unreal Engine中FSavedMove子类转换为FSavedMovePtr的问题
你的问题出在直接用子类裸指针构造父类TSharedPtr的方式不对,Unreal的TSharedPtr需要通过正确的方式完成子类到父类智能指针的转换。
核心原因
FSavedMovePtr是TSharedPtr<FSavedMove_Character>的别名,虽然FSavedMove_Custom继承自FSavedMove_Character,但直接用new FSavedMove_Custom()作为参数传递给FSavedMovePtr的构造函数,编译器无法自动完成裸指针到跨类型智能指针的隐式转换。
正确实现方式
你可以通过两种方式解决:
方式1:使用MakeShareable函数
MakeShareable会创建对应子类的TSharedPtr,由于子类继承自父类,该智能指针可以隐式转换为FSavedMovePtr:
FSavedMovePtr UCustomMoveComponent::FNetworkPredictionData_Client_Custom::AllocateNewMove() { return MakeShareable(new FSavedMove_Custom()); }
方式2:显式指定父类类型构造TSharedPtr
直接构造TSharedPtr<FSavedMove_Character>并传入子类裸指针,编译器会识别这是合法的向上转型:
FSavedMovePtr UCustomMoveComponent::FNetworkPredictionData_Client_Custom::AllocateNewMove() { return TSharedPtr<FSavedMove_Character>(new FSavedMove_Custom()); }
额外注意事项
确保FSavedMove_Character的析构函数是虚函数(Unreal引擎内置的该类已经满足这一点),这样TSharedPtr在销毁对象时才能正确调用子类的析构函数,避免内存泄漏或未定义行为。
内容的提问来源于stack exchange,提问作者UltraMechaKaiju
相关产品推荐
相关产品推荐

