
- •Конспект по "Объектно-ориентированному программированию".
- •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. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?
22. Недостатки наследования?
Недостатки наследования:
1) Скорость выполнения
Программные инструменты общего назначения редко являются такими же быстрыми, как и аккуратно, "вручную" разработанные специальные системы. То есть, унаследованные методы, имеющие дело с подклассами, часто медленнее специального кода.
Но заботы об эффективности часто бывают не к месту. Билл Вульф считает, что "Во имя эффективности (как правило, эфемерной) совершается больше программных ошибок, чем по какой-либо другой причине, включая полную тупость".
Во-первых, разница не слишком велика.
Во-вторых, снижение скорости выполнения может компенсироваться повышением скорости разработки программного обеспечения.
Наконец, большинство программистов на самом деле мало знают о том, как распределены временные затраты в программах.
Поэтому гораздо лучше создать работающую систему, произвести замеры времени, чтобы обнаружить, на что же, собственно, оно тратится, и улучшить эти части, чем затратить уйму времени, заботясь об эффективности на ранних стадиях проекта.
2) Размер программ
Использование любой программной библиотеки часто приводит к увеличению размера программ. Этого не происходит в специально разработанных системах. Хотя такие затраты могут быть существенными, по мере уменьшения стоимости памяти размер программы перестает быть критичным. Снизить затраты на разработку и быстро выдать качественный и свободный от ошибок программный код иногда значит гораздо больше, чем малый размер приложения.
3) Сложность программ
Необдуманное использование наследования может вместо разрешения проблемы сложности подействовать наоборот. Для понимания программы, использующей наследование, может потребоваться несколько сложных переходов вверх и вниз в иерархическом дереве.
23. Общая форма наследования классов? Спецификаторы доступа при наследовании?
В С++ члены класса классифицируются в соответствии с правами доступа на три категории:
– public(публичные) – любая функция программы имеет к ним доступ;
– private(частные) – доступ к ним имеют только функции-члены класса или дружественные функции;
– protected(защищенные) – доступ к ним имеют функции-члены класса или дружественные функции, а также производные классы.
При описании класса в его заголовке перечисляются (через запятую) все классы, которые являются для него базовыми. Возможность обращения к элементам этих классов регулируется с помощью спецификаторов доступа.
Общая форма наследования классов:
classимя_класса:спецификатор_доступаимя_базового_класса
{
. . . тело класса
};
Здесь спецификатор_доступаопределяет, каким способом наследуется базовый класс.
Если спецификатор доступа опущен, по умолчанию подразумевается спецификатор public. В таком случае все публичные (public) и защищенные (protected) члены базового класса становятся соответственно публичными (public) и защищенными (protected) членами производного класса.
Если спецификатор доступа имеет значение private, то публичные (public) и защищенные (protected) члены базового класса становятся частными (private) членами производного класса.
Если спецификатор доступа принимает значение protected, то все публичные (public) и защищенные (protected) члены базового класса становятся защищенными (protected) членами производного класса.
Это можно изобразить в виде таблицы.
Таблица 1 – Спецификаторы доступа при наследовании
Спецификатор доступа производного класса |
Спецификатор базового класса |
Доступ в производном классе |
Комментарий |
public |
public |
public |
Не изменяется |
|
private |
private |
|
|
protected |
protected |
|
private |
public |
private |
Все становятся |
|
private |
private |
private |
|
protected |
private |
|
protected |
public |
protected |
Все становятся protected, |
|
private |
private |
кромеprivate |
|
protected |
protected |
|