Задать вопрос
comargo
@comargo
Программист самоучка

Как реализовать наследование от ветви интерфейсов и базовой реализации корневого интерфейса?

Предположим что есть некий набор публичных интерфейсов (экспортируемых библиотекой):
class IA {
public:
	virtual void f1() = 0;
};

class IB : public IA {
public:
	virtual void f2() = 0;
};


А также есть базовая реализация интерфейса IA:
class A : public IA {
public:
	void f1() {
		std::cout << "f1" << std::endl;
	}
};


Необходимо реализовать интерфейс IB так, чтобы он предоставлял реализацию интерфейса IA классом A:
// Этот код не компилируется
class B :  public IB, public A
{
public:
	void f2() {
		std::cout << "f2" << std::endl;
	}
};

int main(int argc, char* argv[])
{
	B b;
	b.f1();
	b.f2();
	return 0;
}


Код на Coliru

Можно ли это сделать, и как?
Решение "в лоб" не подошло, с порядком и видимостью (public/protected/private) наследования игрался... ничего не помогло.
  • Вопрос задан
  • 2264 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
comargo
@comargo Автор вопроса
Программист самоучка
Ответ на вопрос нашел
https://isocpp.org/wiki/faq/multiple-inheritance#m...
Узнал что виртуальными бывают не только функции, но и наследования.
Спасибо.

Итоговый код:
class IA {
public:
  virtual void f1() = 0;
};

class IB : virtual public IA { // !!! VIRTUAL !!!
public:
  virtual void f2() = 0;
};

class A : virtual public IA { // !!! VIRTUAL !!!
public:
  void f1() {
    std::cout << "f1" << std::endl;
  }
};

class B :  public IB, public A // А вот тут виртуальность необязательна.
{
public:
  void f2() {
    std::cout << "f2" << std::endl;
  }
};

int main(int argc, char* argv[])
{
  B b;
  b.f1();
  b.f2();
  return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
А почему не просто
class B :  public IB, A
{
public:
        void f1() {
                A::f1();
        }
        void f2() {
                std::cout << "f2" << std::endl;
        }
};
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы