Реализация интерфейса, унаследованного от другого интерфейса - PullRequest
0 голосов
/ 31 января 2019

У меня есть абстрактный интерфейс IA, который наследуется от интерфейсов IB и IC с различным поведением.Также у меня есть реализации этих интерфейсов B от IB и C от IC.Что делать, если мне нужен класс 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 голосов
/ 31 января 2019

Вам необходимо заново реализовать каждую функцию 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(); }
};
0 голосов
/ 31 января 2019

Ваша проблема в том, что A наследует два раза от IB, один раз через IA и один раз через B.То же самое верно и для IC.

Чтобы решить эту проблему Diamon , вы должны использовать виртуальное наследование везде, где класс наследует напрямую от 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";
    }
};
0 голосов
/ 31 января 2019

В вашем коде class A наследуется от class IA, class B и class C, а class IA является абстрактным классом, поэтому вы не можете создать его экземпляр.

И из-за 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";}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...