多类继承设置问题

multi class inheritance setup issues

本文关键字:问题 设置 继承      更新时间:2023-10-16

我有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 {};
}

Bimpl b = Bimpl();
b.M2() // Error. M2 is ambigous. Can be from Aimpl or A

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

实质上,您在Bimpl中有两个不同的M2方法:Aimpl::M2B::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 {};
};

请注意,我不是非常非常熟悉虚拟继承,所以这可能是也可能不是应用虚拟继承的最佳方式。