Одной из мощных концепций С++ является множественное наследование
Резюме Одной из мощных концепций С++ является множественное наследование. При аккуратном и правильном использовании — это чрезвычайно полезный механизм. Множественное наследование часто используется в больших библиотеках классов.
В том виде, в котором оно реализовано в С++, множественное наследование часто является источником проблем. В первую очередь, это проблема дублирования и неоднозначности, для решения которой в С++ реализован механизм виртуального наследования. С другой стороны, для решения той же проблемы применяется принцип доминирования. Виртуальное наследование «добавляет неэффек-тиности» — размеры класса-наследника увеличиваются.
Еще одним «необязательным» механизмом С++ стал механизм RTTI, который в некотором роде является альтернативой виртуальным функциям, причем значительно более понятной новичкам, чем механизм виртуальных функций. RTTI позволяет узнать истинный тип объекта во время исполнения программы и выполнить динамическое преобразование типа среди родственных полиморфных классов «во все стороны». Это свойство можно задействовать для реализации мультиметодов, однако использование для тех же целей виртуальных функций предпочтительней.
Контрольные вопросы
1. Сколько классов может быть использовано в качестве базовых?
2. Выполняется ли при множественном наследовании и принцип подстановки?
3. Можно ли наследовать открыто от одного класса, а закрыто от другого?
4. В чем проблемы множественного наследования?
5. Объясните смысл виртуального наследования.
6. Как формулируется принцип доминирования?
7. Какие функции отвечают за инициализацию виртуального базового класса?
8. Объясните принцип реализации «финального» класса.
9. Какие конструкции входят в состав механизма RTTI?
Упражнения
10. Можно ли выполнить понижающее приведение типа с помощью оператора dynamic_cast<>? А повышающее или перекрестное?
11. Чем различается работа оператора dynamic_cast<> при преобразовании указателей и ссылок?
12. Какое исключение генерирует оператор dynamic_cast<> и в каких случаях?
13. В каких случаях генерируется исключение bad__typeid?
14. Дайте определение мультиметодов.
15. Объясните, каким образом механизм RTTI может использоваться при реализации мультиметодов.
Упражнения
1. Реализовать класс Money (см. упражнение 4 в главе 4), использовав множественное наследование. Один базовый класс — класс с подсчетом объектов (см. листинг 4.23), второй — класс Array из упражнения 6 в главе.8.
2. Реализовать шаблон стека как наследник от двух классов-шаблонов. Один шаблон определяет абстрактный интерфейс стека, второй шаблон — это шаблон TDeque (см. главу 6). Реализация методов стека делегируется классу TDeque.
3. Определить абстрактный базовый класс TOb j ect с подсчетом объектов. Реализовать контейнер-список с элементами типа TOb j ect. Использовать множественное наследование для обеспечения возможности хранения в этом контейнере объектов типа Function (см. упражнение 5 в главе 9).
4. Реализовать мультиметод сложения с использованием оператора dynamic_ cast<> для трех видов чисел (см. упражнение 5 в главе 9): действительных (Real), комплексных (Complex) и дробных (Fraction).
5. Реализовать мультиметод умножения для тех же видов чисел, использовав оператор typeidO.
6. Использовать виртуальные функции при реализации мультиметодов сложения и умножения для трех видов чисел.
Опубликовал Kest
December 05 2013 02:04:33 ·
0 Комментариев ·
4121 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Отлично!
100%
[1 Голос]
Очень хорошо
0%
[Нет голосов]
Хорошо
0%
[Нет голосов]
Удовлетворительно
0%
[Нет голосов]
Плохо
0%
[Нет голосов]
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.