enable_shared_from_this的双重继承

Off*_*rmo 10 c++ multiple-inheritance shared-ptr enable-shared-from-this

我有一个对象(Z),它来自另外两个对象(A和B).

A和B都从派生enable_shared_from_this<>分别enable_shared_from_this<A>enable_shared_from_this<B>.

当然我打电话shared_from_this()给Z.当然编译器报告这个含糊不清.

我的问题是:

  • 继承两次是安全的enable_shared_from_this<>还是会创建两个分开的引用计数(坏!)
  • 如果不安全,我该如何解决?

注意:当基类和派生类都继承自boost :: enable_shared_from_this但我没有真正回答时,我发现这个其他问题是坏的弱指针.我virtual也应该使用这个技巧吗?

eca*_*mur 14

是的,根据坏的指针,当base和派生类都从boost :: enable_shared_from_this继承时,解决方案是使用虚拟继承.这是C++ 11标准shared_ptr(不是Boost)的实现:

#include <memory>

struct virtual_enable_shared_from_this_base:
   std::enable_shared_from_this<virtual_enable_shared_from_this_base> {
   virtual ~virtual_enable_shared_from_this_base() {}
};
template<typename T>
struct virtual_enable_shared_from_this:
virtual virtual_enable_shared_from_this_base {
   std::shared_ptr<T> shared_from_this() {
      return std::dynamic_pointer_cast<T>(
         virtual_enable_shared_from_this_base::shared_from_this());
   }
};

struct A: virtual_enable_shared_from_this<A> {};
struct B: virtual_enable_shared_from_this<B> {};
struct Z: A, B { };
int main() {
   std::shared_ptr<Z> z = std::make_shared<Z>();
   std::shared_ptr<B> b = z->B::shared_from_this();
}
Run Code Online (Sandbox Code Playgroud)

这不是默认实现的一部分,可能是因为虚拟继承的开销.