Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Множественное наследование C++

395
09 октября 2006 года
RelB
367 / / 09.11.2002
Всем привет.
Меня тут заинтересовал один вопрос. Можно ли разрешить каким-либо образом данную ситуацию?
Имеем два интерфейса:
 
Код:
struct I1
{
  virtual void Meth() = 0;
};

struct I2
{
  virtual int Meth() = 0;
};

И класс C, который наследуется от этих интерфейсов. Вопрос, возможно ли разрешить в данной ситуации конфликт?
309
09 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Конфликтов не будет. Тем более, что оба метода абстрактные - значит, непосредственно к ним обращения не будет
А для вызова реализованных методов нужно просто явноуказывать, метод какого класса вызывается:
 
Код:
Result = TClass1::Method (Params);
// или
Result = TClass2::Method (Params);
395
09 октября 2006 года
RelB
367 / / 09.11.2002
[QUOTE=el scorpio]Конфликтов не будет. Тем более, что оба метода абстрактные - значит, непосредственно к ним обращения не будет
А для вызова реализованных методов нужно просто явноуказывать, метод какого класса вызывается:
 
Код:
Result = TClass1::Method (Params);
// или
Result = TClass2::Method (Params);
[/QUOTE]Ну-ну, можно тогда посмотреть реализацию класса C?
Т.е.
 
Код:
class C : public I1, public I2
{
....
}

Вот вместо "...." хотелось бы увидеть реализацию.
5.4K
09 октября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=RelB]Вопрос, возможно ли разрешить в данной ситуации конфликт?[/QUOTE]Нет, такие классы - "несовместимые" родители...
309
09 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Relb
Прошу прощения, не заметил, что абстрактные методы имеют разный результат :(
К сожалению, в данном случае создать общий "потомок" не получится, так как для каждого абстрактного метода потребуется объявить и создать реализацию. А так, как существование в одной области видимости двух функций, различающихся только результатом невозможно, то и переопрелить оба виртуальных метода нельзя :(
Создать реализацию одного абстрактного метода в потомке, а другого - в потомке потомка, также не получиться. Потому что виртуальные методы должны иметь однотипные результаты, а у нас в "потомке" будет "void", а у "внука" - "int" :(.
То есть, придётся изменить один из базовых методов: переименовать, добавить/изменить параметры, либо просто объявить этот метод константным. Тогда уже можно будет сделать два разных метода-потомка.
395
10 октября 2006 года
RelB
367 / / 09.11.2002
Вот и я так думал, что не получится, просто у коллеги встала аналогичная проблема и разрешить ее не удалось...
547
10 октября 2006 года
Hydra
488 / / 20.06.2006
Имхо, такое можно разрулить через результат типа void*.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог