能否间接继承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>,有两种可行方案:
- 在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()会抛出异常)。
- 让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
相关产品推荐
相关产品推荐

