C++多重继承 - 为什么你不工作?

Mic*_*ael 8 c++ inheritance multiple-inheritance diamond-problem

我试图找出一个有趣的多继承问题.

祖父母是一个有多种方法的接口类:

class A
{
public:
    virtual int foo() = 0;
    virtual int bar() = 0;
};
Run Code Online (Sandbox Code Playgroud)

然后有部分完成此接口的抽象类.

class B : public A
{
public:
    int foo() { return 0;}
};

class C : public A
{
public:
    int bar() { return 1;}
};
Run Code Online (Sandbox Code Playgroud)

我想要使​​用的类继承自两个父类,并指定通过using指令应该来自哪个方法:

class D : public B, public C
{
public:
    using B::foo;
    using C::bar;
};
Run Code Online (Sandbox Code Playgroud)

当我尝试实例化DI获取错误以尝试实例化抽象类时.

int main()
{
    D d; //<-- Error cannot instantiate abstract class.

    int test = d.foo();
    int test2 = d.bar();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我理解问题以及如何最好地利用部分实现吗?

Jam*_*lis 13

你没有钻石继承.该BC的基类D都有自己的A基类子对象,因为他们没有从实际上继承A.

所以,在D有确实需要实现四星纯虚成员函数:在A::fooA::barBA::fooA::barC.

您可能想要使用虚拟继承.类声明和基类列表如下所示:

class A
class B : public virtual A
class C : public virtual A
class D : public B, public C
Run Code Online (Sandbox Code Playgroud)

如果您不想使用虚拟继承,则需要覆盖其他两个纯虚函数D:

class D : public B, public C
{
public:
    using B::foo;
    using C::bar;

    int B::bar() { return 0; }
    int C::foo() { return 0; }
};
Run Code Online (Sandbox Code Playgroud)