c++ - enable_shared_from_this 的双重继承

标签 c++ shared-ptr multiple-inheritance 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<>继承两次是否安全?或者它会创建两个独立的引用计数(不好!)
  • 如果不安全,我该如何解决?

注意: 我发现了另一个问题 bad weak pointer when base and derived class both inherit from boost::enable_shared_from_this但它并没有真正回答。我应该使用 virtual 吗?也是骗局?

最佳答案

是的,根据 bad weak pointer when base and derived class both inherit from 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();
}

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

关于c++ - enable_shared_from_this 的双重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15549722/

相关文章:

c++ - Boost 程序选项和 shared_ptr

c++ - 如何防止任何人窃取我的 shared_ptr?

C++ 简洁地检查 STL 容器中的项目(例如 vector )

c++ - C++如何允许用户选择选择

c++ - connect() 函数停止程序

c++ - 在 MoveAssignable 的情况下,标准对 self 移动赋值有何看法?

c++ - 如何创建 shared_ptr 的容器到抽象类

c++ - 在 QueryInterface 实现中是否应该使用 dynamic_cast?

Django 的 MutiTable 对比。抽象继承

oop - 多重继承是邪恶的吗?