Вопросс ++ реализация абстрактного класса в другой базовый класс
Почему бы не попробовать виртуальное наследование, если это, кажется, решить мою проблему с бриллиантом наследования ниже?
Брифинг:
В процессе обучения C++, я пришел с некоторыми ошибками компилятора для следующего кода:
#include <stdlib.h>
#include <iostream>
class IFoo{
public:
virtual void Hello() = 0;
};
class Foo : public IFoo{
public:
void Hello()
{
printf("Hello");
}
};
class IBar : public IFoo{
public:
virtual void HelloWorld() = 0;
};
class Bar : public IBar, public Foo{
public:
void HelloWorld()
{
Hello();
printf("World");
}
};
int main()
{
Bar b;
b.HelloWorld();
system("pause");
return 0;
}
Я хочу Бар реализовать абстрактный класс IBar, который имеет IFoo в качестве базового класса, но то я хочу, чтобы вся реализация IFoo предоставлялась вторым базовым классом Bar Foo.
Я получаю 2 ошибки компилятора (GCC 4.9.2): Один из них связан с двусмысленностями, а другой - с отсутствующими реализациями для абстрактного класса IFoo.
Затем я нашел this question и получил, чтобы встретить концепцию виртуального наследования, которая приведет меня к this page. После урока я добавил виртуальное наследование и все проблемы исчезли:
class Foo : public virtual IFoo{...
class IBar : public virtual IFoo{...
Но пользователь в question предложить не попробовать виртуальное наследование. Отсюда мой вопрос.
Вы правы. Я попробовал Foo :: Hello() в Bar :: HelloWorld() без виртуального наследования и избавился от двусмысленности. Я также участвую в C++ 11, поэтому я буду применять переопределяющую практику. Эта структура наследования может не иметь смысла сейчас, но если IFoo имеет 1000+ определений функций, было бы действительно утомительно переопределить все из них в Bar с функциями формы Bar :: func1000() override {Foo :: func1000(); }. Вот почему я ожидал, что Foo предоставит реализацию, но это работает только с виртуальным наследованием. – Heinz
@Heinz Вопрос в том, почему у вас есть бар, наследуемый как от «Foo», так и от «IBar»? Вы в конечном итоге наследуете от 'Foo' дважды, что и вызывает проблемы. Потребность в виртуальном наследовании чаще всего означает плохой дизайн. Для этого определенно используется, но здесь это не имеет смысла. Кроме того, если на ваш вопрос был дан ответ, вы должны отметить один из ответов, как принято. – dwcanillas
@Heinz [Проверить это] (http://www.cprogramming.com/tutorial/virtual_inheritance.html). – dwcanillas