gpt4 book ai didi

c++ - enable_shared_from_this 的双重继承

转载 作者:可可西里 更新时间:2023-11-01 16:32:46 27 4
gpt4 key购买 nike

我有一个对象 (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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com