C++ std::从\u this启用\u共享\u<&燃气轮机;和多重继承

C++ std::从\u this启用\u共享\u<&燃气轮机;和多重继承,c++,pointers,C++,Pointers,当我尝试运行此代码时,会出现坏的\u弱的\u 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&l

当我尝试运行此代码时,会出现坏的\u弱的\u 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();
}
使用名称空间std;
O类{
公众:
O(){}
};
A类:公共std::从虚拟公共O启用共享{
公众:
A(){}
};
B类:公共std::从虚拟公共O启用共享{
公众:
B(){}
void GetShared(){
从_this()共享_;
}   
};
C类:公共A、公共B{
公众:
C(){}
};
int main()
{ 
std::shared_ptr pt=std::make_shared();
pt->GetShared();
}

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

据我所知,您正试图完成可撤销的任务:

<> C++中的继承意味着你也包含父类的相同成员。然而,对于
C类
,这意味着两个类已经被
std::shared\u ptr
持有。但是通过继承,您告诉编译器C应该包含
A
B
的子实例,而不是由
std::shared\u ptr
持有<代码>共享\u来自\u此将在运行时通过错误的弱ptr异常来抱怨这一事实

可能您希望C仅由一个
std::shared\u ptr
持有,然后您可以将其添加到附加的代码中

如果您只想“向上投射”一个
C
的实例,即将其用作
B
的一个类,您可以简单地使用
B&
或使用
std::shared\u ptr
而不使用
std::从该
或仅在最上面的类上启用共享

#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();
}
#包括
使用名称空间std;
O类{
公众:
O(){}
};
结构A:虚拟公共对象{
};
结构B:虚拟O{
B(){}
void GetShared(){
}
};
结构C:std::从这个,A,B启用共享{
C()=默认值;
};
int main()
{
std::shared_ptr pt=std::make_shared();
pt->GetShared();
}

这是个不错的问题,但请包括必要的标题。