我正在尝试找出一个有趣的多重继承问题。
祖父母是一个具有多个方法的接口类:
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;
};
当我尝试实例化 D 时,我因尝试实例化抽象类而收到错误。
int main()
{
D d; //<-- Error cannot instantiate abstract class.
int test = d.foo();
int test2 = d.bar();
return 0;
}
有人可以帮助我理解这个问题以及如何最好地利用部分实现吗?
你没有钻石继承权。这B
and C
的基类D
每个人都有自己的A
基类子对象,因为它们实际上不是继承自A
.
So, in D
,实际上有四个纯虚成员函数需要实现:A::foo
and A::bar
from B
和A::foo
and A::bar
from 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; }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)