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

能否间接继承std::enable_shared_from_this?子类调用shared_from_this是否安全?

问题解答

你的代码里这种间接继承std::enable_shared_from_this的方式存在隐患,直接在B中调用继承来的shared_from_this()会返回shared_ptr<A>,而非shared_ptr<B>,如果你的逻辑需要B类型的智能指针,就必须手动转换,否则会出现类型不匹配的问题,甚至运行时错误。

具体原因

  • std::enable_shared_from_this<T>的模板参数T决定了它返回的智能指针类型。你的基类A继承的是enable_shared_from_this<A>,所以它的shared_from_this()方法返回shared_ptr<A>。
  • 当B继承A后,调用shared_from_this()时,实际调用的是A类中的版本,得到的是指向基类A的智能指针,而非派生类B的。

正确的处理方式

如果你需要在B中获取shared_ptr<B>,有两种可行方案:

  1. 在B类中自定义一个shared_from_this()方法,通过类型转换得到B的智能指针:
class B : public A {
public:
    std::shared_ptr<B> shared_from_this() {
        return std::static_pointer_cast<B>(A::shared_from_this());
    }

    std::shared_ptr<const B> shared_from_this() const {
        return std::static_pointer_cast<const B>(A::shared_from_this());
    }
};

这种方式依赖于A已经正确继承enable_shared_from_this<A>,且B的对象确实被shared_ptr管理(否则A::shared_from_this()会抛出异常)。

  1. 让B直接继承std::enable_shared_from_this<B>——但注意不能同时让A和B都继承enable_shared_from_this,这会导致二义性,编译器会报错。所以如果选择这种方式,需要把A中的enable_shared_from_this<A>继承去掉。

注意事项

无论哪种方式,都必须确保调用shared_from_this()时,当前对象已经被一个shared_ptr持有,否则会触发未定义行为(比如抛出std::bad_weak_ptr异常)。


内容的提问来源于stack exchange,提问作者Liviu Dorobanțu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:42:13