struct I1
{
virtual void Meth() = 0;
};
struct I2
{
virtual int Meth() = 0;
};
Множественное наследование C++
Меня тут заинтересовал один вопрос. Можно ли разрешить каким-либо образом данную ситуацию?
Имеем два интерфейса:
Код:
И класс C, который наследуется от этих интерфейсов. Вопрос, возможно ли разрешить в данной ситуации конфликт?
А для вызова реализованных методов нужно просто явноуказывать, метод какого класса вызывается:
Код:
Result = TClass1::Method (Params);
// или
Result = TClass2::Method (Params);
// или
Result = TClass2::Method (Params);
А для вызова реализованных методов нужно просто явноуказывать, метод какого класса вызывается:
Код:
Result = TClass1::Method (Params);
// или
Result = TClass2::Method (Params);
// или
Result = TClass2::Method (Params);
Т.е.
Код:
class C : public I1, public I2
{
....
}
{
....
}
Вот вместо "...." хотелось бы увидеть реализацию.
[QUOTE=RelB]Вопрос, возможно ли разрешить в данной ситуации конфликт?[/QUOTE]Нет, такие классы - "несовместимые" родители...
Прошу прощения, не заметил, что абстрактные методы имеют разный результат :(
К сожалению, в данном случае создать общий "потомок" не получится, так как для каждого абстрактного метода потребуется объявить и создать реализацию. А так, как существование в одной области видимости двух функций, различающихся только результатом невозможно, то и переопрелить оба виртуальных метода нельзя :(
Создать реализацию одного абстрактного метода в потомке, а другого - в потомке потомка, также не получиться. Потому что виртуальные методы должны иметь однотипные результаты, а у нас в "потомке" будет "void", а у "внука" - "int" :(.
То есть, придётся изменить один из базовых методов: переименовать, добавить/изменить параметры, либо просто объявить этот метод константным. Тогда уже можно будет сделать два разных метода-потомка.
Вот и я так думал, что не получится, просто у коллеги встала аналогичная проблема и разрешить ее не удалось...
Имхо, такое можно разрулить через результат типа void*.