std::vector<std::shared_ptr<ElementDetail>>存储派生类指针报错问题咨询
嗨,我来帮你排查下这个问题~ 你的代码里其实有两个容易忽略的小问题导致了这个错误:
1. 继承权限不对
C++里用class定义的类,默认的继承权限是私有继承(private),你写的class TypecodeDetail : ElementDetail其实是私有继承ElementDetail。这种情况下,TypecodeDetail和ElementDetail之间的类型转换是受限制的,std::shared_ptr<TypecodeDetail>没法自动转换成std::shared_ptr<ElementDetail>,这就是vector的push_back报类型不匹配的核心原因。
解决方法很简单,把继承改成public继承就行:
class TypecodeDetail : public ElementDetail
2. 构造函数参数缺失
你给TypecodeDetail定义的构造函数是TypecodeDetail(uint32_t typecode),它需要一个uint32_t类型的参数,但你调用std::make_shared<TypecodeDetail>()的时候没有传任何参数,这本身也是一个编译错误,即使继承问题解决了,这里也会报错。
你需要给它传一个符合类型的参数,比如:
details.push_back(std::make_shared<TypecodeDetail>(0)); // 这里传0或者你需要的uint32_t值
修改后的完整代码
class ElementDetail { public: virtual void* getData() = 0; }; class TypecodeDetail : public ElementDetail // 改成public继承 { public: TypecodeDetail(uint32_t typecode) : _typeCode(typecode) {} void* getData() override { // 最好加上override明确是重写虚函数 // 这里可以补充你的实现逻辑 return &_typeCode; } private: uint32_t _typeCode{}; }; int main() { std::vector<std::shared_ptr<ElementDetail>> details; details.push_back(std::make_shared<TypecodeDetail>(123)); // 传入构造函数需要的参数 }
你想实现的用std::vector<std::shared_ptr<基类>>来统一管理派生类对象的思路是完全可行的,这也是C++里实现多态容器的标准做法之一,之前踩坑就是因为默认继承权限和构造函数参数这两个小细节没注意到~
备注:内容来源于stack exchange,提问作者Smoggie Tom
相关产品推荐
相关产品推荐

