8

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

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

class A
{
public:
    virtual int foo() = 0;
    virtual int bar() = 0;
};

然后是部分完成这个接口的抽象类。

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

class C : public A
{
public:
    int bar() { return 1;}
};

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

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

当我尝试实例化 DI 时,尝试实例化抽象类时会出错。

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

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

    return 0;
}

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

4

2 回答 2

13

你没有钻石继承权。每个的基类BC基类D都有自己的A基类子对象,因为它们实际上不继承自A.

因此,在 中D,实际上需要实现四个纯虚成员函数: the A::fooand A::barfromB和 the A::fooand A::barfrom C

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

class A
class B : public virtual A
class C : public virtual A
class D : public B, public C

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

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

    int B::bar() { return 0; }
    int C::foo() { return 0; }
};
于 2011-05-03T02:31:35.817 回答
-2

您需要创建基类virtual以使它们正确继承。一般规则是所有非私有成员函数和基类都应该是,virtual除非您知道自己在做什么并且想要禁用该成员/基的正常继承。

于 2011-05-03T02:37:17.600 回答