我有一个抽象接口IA,该接口是从接口IB和IC继承的,具有不同的行为。我也有来自IB的接口B和来自IC的C的实现。如果我需要A类实施IA,但B和C中包含实施的一部分,该怎么办呢?
已编辑: 最小的完整示例:
#include <iostream>
class IB
{
public:
virtual void function_B() = 0;
};
class IC
{
public:
virtual void function_C() = 0;
};
class IA : public IB, public IC
{
};
class B : public IB
{
public:
virtual void function_B()
{
std::cout << "B\n";
}
};
class C : public IC
{
public:
virtual void function_C()
{
std::cout << "C\n";
}
};
// then I want IA implementation, but also to use
// ready implementation B and C
// this way doesn't work, the class A stays abstract
class A: public IA, public B, public C
{
};
int main()
{
IA *a = new A;
a->function_B();
a->function_C();
}
答案 0 :(得分:2)
您的问题是A
从IB
继承了两次,一次是通过IA
,一次是通过B
。 IC
也是如此。
要解决此diamon problem,您必须在类直接从IC
或IB
继承 的任何地方使用虚拟继承:
class IA : public virtual IB, public virtual IC
{
};
class B : public virtual IB
{
public:
virtual void function_B()
{
std::cout << "B\n";
}
};
class C : public virtual IC
{
public:
virtual void function_C()
{
std::cout << "C\n";
}
};
答案 1 :(得分:1)
您需要在IA
中重新实现A
的每个功能。但是这些可以是简单的转发器。
如果可能的话,我还会建议对继承进行聚合,即不要继承自B
和C
,而是使其成为成员:
class A : public IA {
B b_;
C c_;
public:
void function_B() override { b_.b(); }
void function_C() override { c_.c(); }
};
答案 2 :(得分:0)
在您的代码中,class A
继承自class IA
,class B
和class C
,而class IA
是一个抽象类,因此您无法实例化它。 / p>
由于Class IA
是抽象的,因此您class A
也变得抽象。
因此,您需要在class IA
中覆盖class IB
的虚函数(class IC
和class A
的虚函数)。
因此您需要在class A
class A : public IA,public B,public C {
public:
void function_B() override { std::cout << "B\n";}
void function_C() override { std::cout << "C\n";}
};