Как реализовать наследование от ветви интерфейсов и базовой реализации корневого интерфейса? Предположим что есть некий набор публичных интерфейсов (экспортируемых библиотекой):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) наследования игрался... ничего не помогло.

21 Авг 2019 в 07:08
195 +1
0
Ответы
1

Для реализации наследования от ветви интерфейсов и базовой реализации корневого интерфейса можно воспользоваться множественным наследованием и виртуальным наследованием.

В данном случае, класс B должен наследоваться от IB и виртуально от A, чтобы избежать проблемы с дублированием базового класса при множественном наследовании. Также нужно переопределить метод f1 в классе B, чтобы вызывалась реализация из класса A.

Пример кода:

#include <iostream>
class IA {
public:
virtual void f1() = 0;
};
class IB : public virtual IA {
public:
virtual void f2() = 0;
};
class A : public virtual IA {
public:
void f1() {
std::cout << "f1" << std::endl;
}
};
class B : public IB, public A {
public:
void f2() {
std::cout << "f2" << std::endl;
}
void f1() {
A::f1();
}
};
int main() {
B b;
b.f1();
b.f2();
return 0;
}

Теперь класс B реализует интерфейс IB и является наследником класса A. Метод f1 вызывает реализацию из класса A, а метод f2 реализуется в классе B. В этом случае код компилируется и работает корректно.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 948 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир