C++中shared_ptr指向派生类的赋值及链接错误问题求助
你遇到的operator=不匹配错误,核心原因是Derived采用了默认的private继承。C++中类的默认继承权限是private,这意味着Derived和Base的继承关系在类外部不可见,std::shared_ptr<Derived>无法隐式转换为std::shared_ptr<Base>(这种转换要求继承是public的,保证类型兼容性)。
修正方法:把Derived的继承方式显式改为public,同时将Derived的构造函数设为public(否则std::make_shared无法创建实例):
class Derived : public Base { public: Derived() {} void do_stuff() override; // 建议加override关键字,明确重写基类虚函数 }; void Derived::do_stuff() { // 编写具体逻辑 }
第二个错误:链接错误的原因与修复
改成public继承后出现的undefined reference to ‘Base::Base()’,是因为你只声明了Base的构造函数,但未提供实现。
Base类中声明了Base();,但既没有在类内定义(比如Base() {}),也没有在类外实现。当Derived的构造函数被调用时,会自动调用Base的构造函数,链接器找不到该构造函数的具体实现,就会抛出这个错误。
修复方式有两种:
- 若Base不需要自定义构造逻辑,直接删除
Base();的声明,编译器会自动生成默认构造函数。 - 显式提供构造函数实现,比如在类内定义:
class Base { public: Base() = default; // 显式生成默认构造,或写成Base() {} virtual void do_stuff() = 0; virtual ~Base() = default; // 额外建议:基类必须加虚析构,避免shared_ptr释放时内存泄漏 };
额外提醒:Base作为含纯虚函数的抽象基类,必须声明虚析构函数,否则std::shared_ptr<Base>指向Derived对象时,释放内存只会调用Base的非虚析构函数,导致Derived的资源无法正确释放,引发内存泄漏。
内容的提问来源于stack exchange,提问作者user93114
相关产品推荐
相关产品推荐

