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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:12:37