继承了另一个接口的接口的实现

Implementation of Interface inherited of another Interfaces

本文关键字:接口 实现 另一个 继承      更新时间:2023-10-16

我有一个抽象接口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 << "Bn";
    }
};
class C : public IC
{
public:
    virtual void function_C()
    {
        std::cout << "Cn";
    }
};
// 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();
}

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

要解决这个 diamon 问题,您必须在类直接从ICIB继承的地方使用虚拟继承:

class IA : public virtual IB, public virtual IC
{
};

class B : public virtual IB
{
public:
    virtual void function_B()
    {
        std::cout << "Bn";
    }
};
class C : public virtual IC
{
public:
    virtual void function_C()
    {
        std::cout << "Cn";
    }
};
您需要

A中重新实现IA的每个功能。但这些可以是简单的转发器。

如果可能的话,我还建议聚合而不是继承,即不从BC继承,而是使它们成为成员:

class A : public IA {
    B b_;
    C c_;
public:
    void function_B() override { b_.b(); }
    void function_C() override { c_.c(); }
};
<</div> div class="answers">

在你的代码中,class A继承自class IAclass Bclass Cclass IA是一个抽象类,所以你不能实例化它。

由于Class IA是抽象的,所以你class A也变得抽象。所以你需要覆盖class IA的虚函数(class IBclass IC的i-e函数)class A

所以你需要在class A中重新实现上述功能

class A : public IA,public B,public C {
public:
    void function_B() override { std::cout << "Bn";}
    void function_C() override { std::cout << "Cn";}
};