Вот более сложный пример применения разных аспектов дублируемого наследования.
Проблема, близкая по духу нашему примеру, возникла из интересного обсуждения в основной книге по C++ [Stroustrup 1991].
Рассмотрим класс
Опишем окно с рамкой и с поддержкой меню. В результате мы породим класс
Рис. 15.24. Варианты окна
Переопределим метод
class WINDOW feature
display is
-- Отобразить окно (общий алгоритм)
do
...
end
... Другие компоненты ...
end
Наследник
class WINDOW_WITH_BORDER inherit
WINDOW
redefine display end
feature -- Output
display is
-- Рисует окно и его рамку.
do
Precursor
draw_border
end
feature {NONE} -- Implementation
draw_border is do ... end
...
end
Обратите внимание на процедуру
class WINDOW_WITH_MENU inherit
WINDOW
redefine display end
feature -- Output
display is
-- Рисует окно и его меню.
do
Precursor
draw_menu
end
feature {NONE} -- Implementation
draw_menu is do ... end
...
end
Осталось описать общего наследника
indexing
WARNING: 'Первая попытка - версия не будет работать корректно!'
class WINDOW_WITH_BORDER_AND_MENU inherit
WINDOW_WITH_BORDER
redefine display end
WINDOW_WITH_MENU
redefine display end
feature
display is
-- Рисует окно,его рамку и меню.
do
Precursor {WINDOW_WITH_BORDER}
Precursor {WINDOW_WITH_MENU}
end
...
end
Заметьте: при каждом обращении к
Впрочем, как замечает Страуструп, это решение некорректно: версии родителей дважды вызывают исходную версию
