从其他接口继承的接口的实现

时间:2019-01-31 13:09:27

标签: c++ multiple-inheritance

我有一个抽象接口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();
}

3 个答案:

答案 0 :(得分:2)

您的问题是AIB继承了两次,一次是通过IA,一次是通过BIC也是如此。

要解决此diamon problem,您必须在类直接从ICIB继承 的任何地方使用虚拟继承:

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的每个功能。但是这些可以是简单的转发器。

如果可能的话,我还会建议对继承进行聚合,即不要继承自BC,而是使其成为成员:

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 IAclass Bclass C,而class IA是一个抽象类,因此您无法实例化它。 / p>

由于Class IA是抽象的,因此您class A也变得抽象。 因此,您需要在class IA中覆盖class IB的虚函数(class ICclass 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";}
};