C++ 多类继承设置问题

C++ 多类继承设置问题,c++,inheritance,C++,Inheritance,我有3个这样的接口(纯虚拟)类 class A { virtual void M1() = 0; virtual void M2() = 0; }; class B : public A { virtual void M3() = 0; }; class C : public A { virtual void M4() = 0; }; class Aimpl : A { void M1 () override {}; void M2 () o

我有3个这样的接口(纯虚拟)类

class A {
    virtual void M1() = 0;
    virtual void M2() = 0;
};

class B : public A {
    virtual void M3() = 0;
};

class C : public A {
    virtual void M4() = 0;
};
class Aimpl : A {
    void M1 () override {};
    void M2 () override {};
}

class Bimpl: public Aimpl, public B{
     void M3() override {};
}

class Cimpl: public Aimpl, public C{
     void M4() override {};
}
我有这样的实现者

class A {
    virtual void M1() = 0;
    virtual void M2() = 0;
};

class B : public A {
    virtual void M3() = 0;
};

class C : public A {
    virtual void M4() = 0;
};
class Aimpl : A {
    void M1 () override {};
    void M2 () override {};
}

class Bimpl: public Aimpl, public B{
     void M3() override {};
}

class Cimpl: public Aimpl, public C{
     void M4() override {};
}


解决这个问题的简单方法是什么?我希望能够在函数中传递B或C,而不是Bimpl

本质上,在
Bimpl
中有两种不同的
M2
方法:
Aimpl::M2
B::M2
。你遇到了麻烦

要修复它,您应该使用虚拟继承。提供了一个非常好的概述。基本上,您应该使用以下内容:

class A {
    virtual void M1() = 0;
    virtual void M2() = 0;
};

class B : public virtual A {
    virtual void M3() = 0;
};

class C : public virtual A {
    virtual void M4() = 0;
};

class Aimpl : public virtual A {
    void M1 () override {};
    void M2 () override {};
};

class Bimpl: public virtual Aimpl, public virtual B {
     void M3() override {};
};

class Cimpl: public virtual Aimpl, public virtual C {
     void M4() override {};
};

请注意,我对虚拟继承并不十分熟悉,因此这可能是也可能不是应用虚拟继承的最佳方式。

no.public。忘记了关键字TheRecomiles with clang,但是vc++给出了警告,说Cimpl通过支配继承了M1,并且警告在我的项目中被视为错误。@RandomThink