
- •Конспект по "Объектно-ориентированному программированию".
- •1. Что такое объект? Понятия "состояние" и "поведение"?
- •2. Понятия "интерфейс" и "реализация"?
- •3. Понятия "класс" и "абстрактный тип данных"?
- •4. Основные категории классов?
- •5. Объявление класса? Общий вид объявления класса? Включение кода метода внутри объявления класса?
- •6. Особенности локальных классов?
- •7. Понятие inline-метода. Способы создания?
- •9. Константный объект? Константный метод?
- •10. Конструктор. Его назначение и синтаксические конструкции вызова конструктора?
- •11. Конструктор копирования. Общий вид и случаи вызова?
- •12. Что называется конструктором по умолчанию? Конструктором преобразования?
- •13. Основные свойства и правила использования конструкторов.
- •14. Деструктор. Вызов деструкторов (автоматический и явный).
- •15. Основные свойства и правила использования деструкторов.
- •16. Создание и уничтожение объектов.
- •17. Что такое наследование?
- •18. Понятия "базовый класс" и "производный класс"?
- •19. Принцип подстановки. Различие между понятиями "подкласс" и "подтип"?
- •20. Основные формы наследования?
- •21. Преимущества наследования?
- •22. Недостатки наследования?
- •23. Общая форма наследования классов? Спецификаторы доступа при наследовании?
- •24. Конструкторы и деструкторы производных классов? Порядок вызова конструкторов и деструкторов при множественном наследовании?
- •25. Множественное наследование. Общая форма?
- •26. Передача параметров в базовый класс. Назначение. Общая форма?
- •27. Указатели и ссылки на производные классы?
- •28. Виртуальная функция. Объявление виртуальной функции?
- •29. Чисто виртуальная функция. Общая форма чисто виртуальной функции?
- •30. Понятие "абстрактный класс".
- •31. Что такое полиморфизм? в каких формах он может существовать?
- •32. Понятие "перегрузка"?
- •33. Приведение типа. Неопределенность. Причины возникновения неопределенности и способы ее устранения?
- •34. Понятие "параметрическая перегрузка"?
- •35. Понятие "переопределение"? в чем заключается различие между перегрузкой и переопределением?
- •36. В чем заключается процесс уточнения?
- •37. Что такое шаблоны (или обобщенные функции)? Их назначение?
- •38. Функция-шаблон. Назначение функции-шаблона? Общий вид функции-шаблона?
- •39. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?
20. Основные формы наследования?
Наследование применяется по-разному и не всегда обеспечивает порождение подтипов. Более того, иногда происходит так, что различные методы класса реализуют наследование по-разному.
Наиболее часто используемые формы наследования:
1) специализация– класс-потомок является более конкретным, частным или специализированным случаем родительского класса.
Например, класс окон Window предоставляет общие операции работы с окнами (сдвиг, изменение размеров, свертывание и т.д.). Специализированный подкласс текстовых окон TextEditWindow наследует операции работы с окнами и дополнительно обеспечивает средства, позволяющие окну отображать текстовую информацию, а пользователю – ее редактировать.
Специализация является наиболее идеальной формой наследования, к которой должна стремиться хорошая программа. Например, в данном случае подкласс текстовых окон удовлетворяет всем свойствам, ожидаемым от окон в общем виде и, следовательно, является еще и подтипом класса Window.
2) спецификация– родительский класс описывает поведение, которое реализуется в классе-потомке, но оставлено нереализованным в родительском.
Такая форма наследования гарантирует поддержку классами определенного общего интерфейса, то есть реализацию ими одних и тех же методов. Родительский класс может быть комбинацией реализованных операций и операций, осуществление которых доверено подклассам. Часто нет никаких отличий в интерфейсе между родительским и порожденным классами– последний просто обеспечивает выполнение описанного, но не реализованного в родительском классе поведения.
Например, в программе, имитирующей игру в бильярд, создан абстрактный класс "Графические объекты", в котором описаны, но не реализованы методы отображения объектов и их реакция на соприкосновение с шаром. Для воплощения этих методов порождены подклассы "Шар", "Стенка" и "Луза".
3) конструирование– класс-потомок использует методы, предоставляемые родительским классом, но представители подкласса не подставляются туда, где используются представители родительского класса.
Например, создание класса для записи значений в двоичный файл. Родительский класс, как правило, обеспечивает запись только неструктурированных двоичных данных. Подкласс строится для каждой структуры, требующей сохранения, и реализует процедуру хранения для определенного типа данных, которая использует методы родительского класса для непосредственной записи.
4) обобщение– класс-потомок модифицирует или переопределяет некоторые методы родительского класса, чтобы получить объект более общей категории.
При данной форме наследования потомок расширяет родительский класс для создания объекта более общего типа.
Например, в системе графического отображения определен класс Window для черно-белого фона. Для создания цветных графических окон определен класс ColoredWindow Цвет фона будет отличаться от белого за счет добавления нового поля, содержащего цвет. Также переопределяется наследуемая процедура изображения окна, в которой происходит фоновая заливка.
Такая форма наследования часто используется в случае, когда общий проект основывается в первую очередь на значениях данных и меньше – на функциональном поведении (в данном примере цветное окно содержит поля данных, необязательные в случае черно-белого окна).
5) расширение– класс-потомок добавляет новые функциональные возможности к родительскому классу, но не меняет наследуемое поведение.
Например, существует класс множеств "Множества". Подклассом для расширения в данном случае будет класс-потомок "Строковые множества", созданный для хранения строковых величин. Этот подкласс мог бы предоставлять дополнительные методы для работы со строками, например, поиск подстроки и т.д.
6) ограничение– класс-потомок ограничивает использование некоторых методов родительского класса.
Например, в существующей библиотеке классов есть структура данных "Очередь с двумя концами", то есть элементы могут добавляться или удаляться с любого конца структуры типа. Но программисту нужно создать класс "Стек", чтобы добавлять или удалять элементы только с одного конца стека.
Такая форма наследования является явным нарушением принципа подстановки и строит подклассы, не являющиеся подтипами, поэтому по возможности следует избегать использования наследования для ограничения.
7) варьирование– производный и родительский классы являются вариациями на одну тему, и связь "класс – подкласс" произвольна.
Варьирование применяется, когда два класса имеют сходную реализацию, но не имеют никакой видимой иерархической связи между понятиями, которые представляют.
Например, программа для управления манипулятором "мышь" может быть почти идентичной программе, которая требуется для управления графическим планшетом. Но теоретически нет никаких причин, чтобы класс, управляющий "мышью", был подклассом класса "графический планшет" или наоборот. Возможно два варианта решения этой проблемы:
– можно произвольно выбрать один из этих классов в качестве родителя, при этом другой класс наследует общую часть программного кода и переопределяет код, зависящий от устройства;
– /более предпочтительный вариант/общий для обоих классов код выделяется в абстрактный класс, и оба класса порождаются от этого общего предка. НО при доработке уже существующего класса этот вариант может оказаться недоступным.
8) комбинирование– это создание подкласса, представляющего собой комбинацию двух или более родительских классов. То есть класс-потомок наследует черты более чем одного родительского класса. Это – множественное наследование.
Например, компьютер имеет характерные особенности печатной машинки, калькулятора, проигрывателя CD и т.д., следовательно, может вести себя по-разному.