
- •Конспект по "Объектно-ориентированному программированию".
- •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. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?
24. Конструкторы и деструкторы производных классов? Порядок вызова конструкторов и деструкторов при множественном наследовании?
Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы.
Конструктор базового класса выполняетсяперед конструктором производного класса, так как базовый класс "ничего не знает" про свои производные классы.
Конструкторы вызываютсяв том порядке, в каком классы следуют один за другим в иерархии классов.
Деструктор производного класса вызываетсяперед деструктором базового класса, потому что уничтожение объекта базового класса влечет за собой уничтожение объекта производного класса.
Деструкторы не наследуются, и если в производном классе деструктор отсутствует, он формируется по умолчанию и вызывает деструкторы всех базовых классов.
25. Множественное наследование. Общая форма?
Существует два типа наследования:
- одиночное;
- множественное.
– при одиночном наследованиипроизводный класс имеет только один непосредственный базовый класс (приведенный выше пример с лодками);
– при множественном наследованиипроизводный класс может быть прямо порожден от одного или нескольких базовых классов.
Общая форма множественного наследованияимеет вид:
classимя_порожденного_класса:список базовых классов
{
. . . тело класса
};
26. Передача параметров в базовый класс. Назначение. Общая форма?
В случае, когда базовый класс содержит конструктор с аргументами, производные классы должны явно передавать базовому классу необходимые аргументы.
Для этого используется расширенная форма конструкторов производных классов, в которые передаются аргументы конструкторам базового класса.
Эта форма выглядит следующим образом:
порожденый_конструктор(список_аргументов):базовый_класс1(список_аргументов),
базовый_класс2(список_аргументов), . . ., базовый_классN(список_аргументов)
{
. . . тело класса
};
27. Указатели и ссылки на производные классы?
В общем случаеуказатель одного класса не может указывать на объект другого класса.
Но в производных классахуказатель на базовый класс может указывать на объект производного класса, полученного из этого базового класса.
Для получения доступа к элементам подкласса с помощью указателя на базовый класс, нужно воспользоваться приведением типов.
Например, вызов функции show_phone()классаNasl_objectс приведением типов выглядит следующим образом:
((Nasl_class *)p)-> show_phone();
С технической точки зрения такое приведение типов является правильным, НО рекомендуется по возможности его избегать, так как приведение типов может служить источником дополнительных ошибок в коде.
Указатель на базовый класс может использоваться и как указатель на производный объект. ОДНАКО указатель на производный класс не может использоваться для доступа к объектам базового типа.
Операции инкремента и декремента указателя выполняются по отношению к его базовому классу.
То есть, если указатель на базовый класс указывает на объект подкласса, инкремент или декремент его не даст указатель на следующий объект подкласса. Поэтому нельзя использовать эти операции, когда они указывают на объект производного класса.
Ссылки на базовый класс могут быть использованы для ссылок на объект подкласса. То есть, если параметр является ссылкой на базовый класс, то он может принимать значение ссылки, как на объект базового класса, так и на объекты подкласса. Такая техника наиболее употребительна при работе с функциями.