Множественный конфликт наследования

У меня есть следующий код:

class Interface
{
virtual void method()=0;
};

class Base : public Interface
{
virtual void method()
{
//implementation here
}
};

class Parent: public Interface
{

};

class Child : public Base, public Parent
{

};

int main()
{
Child c;//ERROR: cannot instantiate abstract class
}

Теперь я знаю, почему это происходит, так как я наследую Parent, тогда мне нужно снова реализовать метод. Но это уже определено в Базовом классе, и я не хочу переопределять это определение для каждого дочернего класса. Я думаю, что был какой-то стандартный способ избавиться от этого в c ++ (сообщая компилятору, какую копию интерфейса следует использовать), я просто не могу вспомнить, что это было.

2

Решение

У вас есть ромбовидная иерархия, но вы не используете виртуальное наследование.

В результате вы получите два разных виртуальных method() функции в вашем Child учебный класс.

Один из способов исправить это — перейти к использованию виртуального наследования. Таким образом, у вас будет только один Child::method() и не нужно две реализации.

1

Другие решения

То, о чем ты говоришь, называется господство.

Из связанной статьи:

class Parent
{
public:
virtual void function();
};

class Child1 : public virtual Parent
{
public:
void function();
};

class Child2 : public virtual Parent
{
};

class Grandchild : public Child1, public Child2
{
public:
Grandchild()
{
function();
}
};
4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector