标准::enable_shared_from_this<>和多重继承



当我尝试运行此代码时bad_weak_ptr出现异常:

using namespace std; 
class O {
public:
O() {}
};

class A : public std::enable_shared_from_this<A>, virtual public O {
public: 
A() {}
};
class B : public std::enable_shared_from_this<B>, virtual public O {
public: 
B() {}
void GetShared() { 
shared_from_this();
}   
};
class C : public A, public B {
public:
C()  {}
};

int main() 
{ 
std::shared_ptr<B> pt = std::make_shared<C>();
pt->GetShared();
}

我想创建 C 类的实例,但随后返回 B shared_ptr因为这是其他接口所需的。有没有办法修复此代码?我似乎做不到。

据我所知,您正在尝试执行不可操作的操作:

C++ 中的继承意味着您还包括父类的相同成员。但是,对于class C来说,这意味着已经应该由std::shared_ptr持有的 2 个类。但是通过继承,你告诉编译器 C 应该包含A的子实例,B不是由std::shared_ptr持有的。shared_from_this将在运行时通过一个糟糕的弱 ptr 异常来抱怨这一事实。

可能您希望C仅由std::shared_ptr持有,然后您可以附加到附加的代码。

如果您只是想"向上转换"C的实例,即使用它,因为它将是一个B类,您可以简单地使用B&或使用std::shared_ptr而不带std::enables_shared_from_this或仅在最向上的类上使用。

#include <memory>
using namespace std;
class O {
public:
O() {}
};
struct A : virtual public O {
};
struct B : virtual O {
B() {}
void GetShared() {
}
};
struct C : std::enable_shared_from_this<C>, A, B {
C() = default;
};
int main()
{
std::shared_ptr<B> pt = std::make_shared<C>();
pt->GetShared();
}

最新更新