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,提问作者임건우
相关产品推荐
相关产品推荐

