Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
8
Добавлен:
25.04.2019
Размер:
1.34 Mб
Скачать

Return 0;

}

Работа приведенной программы очевидна из комментариев. Единственное, о чем следует сказать отдельно, – обработка модификаторов const, volatile, const volatile. Операция typeid, согласно стандарту, игнорирует любые модификаторы первого уровня. Например, const A и A, const B & и B она будет считать идентичными типами соответственно, а const A * и A * она будет различать (здесь const – модификатор второго уровня).

Рассмотренный в данной главе механизм наследования существенно расширяет возможности языка С++ с точки зрения формирования новых классов и отношений между ними. В то же время, существуют ситуации, когда наследование не дает достаточно гибких решений или вообще неприменимо ввиду концептуальных ограничений предметной области. В этих случаях более разумным может оказаться использование механизма дружественных функций и классов, который рассмотрен в следующей главе, а также механизма вложения, описанного в главе 4.

Вопросы для самопроверки

  1. Охарактеризуйте понятие наследования.

  2. Какие формы наследования поддерживаются в С++?

  3. Дайте общий формат определения производного класса.

  4. Опишите структуру объекта производного класса.

  5. В каком порядке вызываются конструкторы и деструкторы при создании и удалении объекта производного класса?

  6. В каких случаях при построении производного класса целесообразно использование закрытого и защищенного наследования? Дайте обоснование и приведите пример.

  7. Дан класс CEmployee, описывающий сотрудника некоторой фирмы, а также классы CChief и COrdinary, представляющие соответственно руководящих и рядовых сотрудников этой фирмы. Как наиболее эффективно объединить эти классы в иерархию? Приведите эскиз.

  8. Дан класс CDate, описывающий даты, и класс CEmployee, представляющий сотрудников некоторой организации. Класс CEmployee должен содержать дату рождения сотрудника; для ее представления разумно использовать уже готовый класс CDate. Какую схему наследования необходимо применить, чтобы эффективно использовать функциональность класса CDate в классе CEmployee. Привести эскиз классовой иерархии и дать ее обоснование.

  9. Дан класс CPerson, описывающий человека, и класс CEmployee, представляющий сотрудников некоторой организации. Ясно, что класс CEmployee будет содержать многое из того, что есть в CPerson, поэтому разумно связать эти два класса отношением наследования. Какую схему наследования необходимо применить, чтобы эффективно использовать функциональность класса CPerson в классе CEmployee. Привести эскиз классовой иерархии и дать ее обоснование.

  10. Даны классы CArmor, CFighter, CBomber, CArtillery, представляющие вражеские цели в программе «виртуальная карта разведчика» (CArmor – танки, CFighter – истребители, CBomber – бомбардировщики, CArtillery – артиллерийские орудия). Как наиболее рационально связать эти классы в иерархию?

  11. Что такое полиморфизм?

  12. В чем отличие между статическим и виртуальным полиморфизмом? Приведите пример.

  13. Какие классы принято называть полиморфными?

  14. Приведите концептуальные отличия между виртуальными и невиртуальными компонентными функциями.

  15. Почему деструктор базового класса обязательно должен быть виртуальным? Опишите возможные последствия его «невиртуальности» на примере.

  16. В каком случае приведенное ниже определение деструктора базового класса X следует считать правильным и безопасным: ~X() { delete[] __data; } ? Поясните ответ.

  17. Пусть в некотором классе CSomeClass есть компонентная функция SomeFunc. Класс CSomeClass предполагается использовать в качестве базового в классовой иерархии. По каким признакам можно определить, следует ли делать функцию SomeFunc виртуальной?

  18. Класс CMatrix содержит функцию virtual void Input(); Производный от него класс CSpecialMatrix включает функцию virtual void Input(istream &); К чему приводит несоответствие сигнатур функции Input в базовом и производном классах?

  19. Требуется спроектировать классы, представляющие прямоугольники, квадраты, эллипсы, окружности и треугольники. Как наиболее рационально построить иерархию из этих классов? Приведите эскизы определения классов.

  20. Какие классы называют абстрактными? Приведите пример определения абстрактного класса.

  21. Как поступить, если проектируемый класс надо сделать абстрактным, но функций, которые можно было бы объявить чисто виртуальными, нет?

  22. При каком условии возможно создание объекта абстрактного класса?

  23. Опишите концептуальные отличия между виртуальными и чисто виртуальными функциями.

  24. Имеется класс, описывающий интерфейсные окна графической системы. Выделите те аспекты поведения этого класса, которые позволяют сделать его абстрактным.

  25. Что понимается под статическим и динамическим типами выражения?

  26. Как можно получить название текущего динамического типа выражения? Приведите фрагмент кода.

  27. Каким образом можно сравнить динамические типы двух выражений?

  28. Класс C определен в виде: class C: A, B { /* */ }; Определения классов A, B, в свою очередь, имеют вид: class A: W { /* */ }; class B: W { /* */ }; (здесь W – еще один класс). Правильно ли определен конструктор класса C, если известно, что во всех классах A, B, C, W определены конструкторы по умолчанию: C::C(): A(), B() {} Будет ли это определение верным при виртуальном базовом классе W?

  29. Опишите сущность проблемы доминирования виртуальных функций при множественном наследовании.

  30. Каковы особенности применения операции dynamic_cast в иерархиях классов с множественным наследованием?

  31. Можно ли один и тот же базовый класс использовать и как виртуальный, и как невиртуальный? Приведите пример такой иерархии классов.

  32. Каким образом можно сделать функцию виртуальной по отношению к двум динамическим типам одновременно? Ответ поясните примером.

Задачи

  1. Разработать иерархию классов для представления возможностей виртуальных радиоприемников и магнитофонов. При разработке максимально использовать возможности наследования, чтобы сократить объем дублируемого кода. Показать использование объектов-приемников и -магнитофонов.

  2. Построить иерархию классов, моделирующую вражеские цели в вооруженном конфликте: "танки", "бомбардировщики" и "истребители". При разработке максимально использовать возможности наследования, чтобы сократить объем дублируемого кода. Показать использование объектов-целей в программе.

  3. Придумать иерархию классов, которая бы наиболее рационально представляла животных в виртуальном справочнике любителя животных. Необходимо представить только классы млекопитающих, птиц и рыб. Для моделирования общих свойств этих классов можно использовать абстрактные базовые классы.

  4. Предложить иерархию классов, описывающую цели для пункта управления огнем дивизионной артиллерии. Требуется представить следующие классы целей: бронированные машины (БТР, танки); стационарные артиллерийские орудия (гаубицы, системы залпового огня); пункты сосредоточения личного состава (штабы, казармы). Для описания общих свойств классов можно применить абстрактные базовые классы.

  5. Разработать фрагмент иерархии классов для компьютерной игры "Подземелье гоблинов". Суть игры проста: в подземном лабиринте, где есть клад, живут гоблины. Задача героя - найти клад. Но гоблины не только помогают герою в поисках клада, но и мешают. Разработке подлежат классы: гоблин; злой гоблин (мешает герою в поисках клада); добрый гоблин (помогает герою найти клад); гоблин-хамелеон (это гоблин, который может быть как злым, так и добрым в зависимости от обстоятельств).

  6. Разработать часть классовой иерархии для описания объектов системы автоматического управления. В число классов включаются: объект управления, робот, технологическая ячейка, роботизированная технологическая ячейка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]