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

C++类的shared_ptr向上转换失败(C2440)问题咨询

问题原因与解决方法

问题根源

C++中结构体默认的继承方式是public,而类默认的继承方式是private。

你提供的类代码示例里,FTestDerived : FTestBase 实际是private继承关系,这种情况下派生类对象无法隐式转换为基类对象,而std::shared_ptr的向上转换依赖于合法的类类型转换,因此触发了C2440编译错误。

而结构体示例用的是默认public继承,派生类到基类的转换完全合法,所以shared_ptr的向上转换可以正常编译。

解决方法

将类的继承显式声明为public即可实现shared_ptr的向上转换:

class FTestBase
{
public:
    FTestBase() {}
};

// 显式指定public继承
class FTestDerived : public FTestBase
{
public:
    FTestDerived() {}
};

std::shared_ptr<FTestBase> tmp = std::make_shared<FTestDerived>(); // 编译正常

另外也可以通过std::static_pointer_cast显式完成转换,但更符合面向对象语义的做法是使用public继承,这才是向上转型的标准实现方式。

内容的提问来源于stack exchange,提问作者임건우

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:02:17