
- •1. Парадигмы программирования, основные направления в программировании.
- •2.Возникновение ооп
- •Базовые принципы и конструкции ооп
- •4. Особенности процедурного и объектно-ориентированного программирования
- •Основные положения объектной модели и ее преимущества и недостатки
- •Абстрагирование. Модульность. Иерархия. Типизация
- •Максимизация эффективности использования памяти компьютера.
- •11. Использование new и delete для реализации динамических массивов (одномерных и двумерных). Инициализация динамически выделенной памяти.
- •12. Базовые конструкции объектно-ориентированных программ: классы и объекты.
- •13. Концепция, определение, реализация класса. Принцип инкапсуляции. Атрибуты доступа к содержимому класса.
- •14. Инициализация и разрушение объекта. Способы доступа к содержимому класса. Поля и методы класса
- •15. Конструкторы и деструкторы класса. Конструктор по умолчанию
- •32. Сравнение классов и структур. Сравнение классов и объединений
- •18. Организация внешнего доступа к локальным компонентам класса. Встраиваемые методы класса. Использование встраиваемых методов в определении класса.
- •19. Инициализация массивов объектов. Указатель this. Указатели на объекты.
- •Int get_i() {return I; }
- •Int get_h() {return h; }
- •Int main()
- •20. Динамическая и статическая инициализация переменных и объектов.
- •42. Дружественные функции класса. Перегрузка функций и методов. Особенности перегрузки операторов как метода класса и как дружественной функции.
- •24. Создание, особенности использование конструктора копии при передаче объекта в качестве параметра функции, возврате объекта из функции и инициализации объектов.
- •25. Локальные static-переменные. Глобальные static-переменные.
- •27. Использование ключевого слова const при создании переменной и объекта класса. . Константные аргументы и возвращаемые значения методов класса. Вложенные классы.
- •28. Перегрузка операторов для пользовательских типов данных. Перегрузка унарных операторов. Перегрузка бинарных операторов. Особенности использования ключевого слова operator.
- •29. Аргументы перегружаемого оператора. Значения, возвращаемые перегружаемым оператором. Временные безымянные объекты.
- •30. Перегрузка постфиксных операторов. Перегрузка оператора ()
- •Int &operator[](int I) {return a[I];}
- •33. Перегрузка оператора *. Перегрузка оператора присваивания
- •34. Особенности преобразования типов данных. Явные преобразования. Преобразования типов, определенных в программе. Особенности преобразования основных типов в основные типы.
- •35. Особенности использования указателей и ссылок. Ссылки как параметры методов и как возвращаемые значения. Статические и динамические объекты.
- •37. Наследование, базовый и производный классы. Иерархия классов
- •38. Определение производного класса, доступ к содержимому базового класса. Использование конструкторов, полей и методов базового класса.
- •39. Спецификатор доступа protected, недостатки использования спецификатора protected.
- •40. Неизменность базового класса. Конструкторы производного класса. Переопределение методов базового класса.
- •42. Общее, частное и защищенное наследование. Комбинации атрибутов доступа при наследовании. Выбор атрибута доступа при наследовании. Уровни наследования. Множественное наследование.
- •43. Методы классов и множественное наследование. Неопределенности при множественном наследовании и способы её разрешения.
- •44. Конструкторы при множественном наследовании. Конструкторы без аргументов и конструкторы с аргументами при множественном наследовании.
- •45. Связь включения. Классы в классах. Композиция и наследование. Роль наследования при разработке программ.
- •46.Указатели и ссылки на производные типы. Понятие и сравнение раннего связывания с поздним.
- •47. Множественное наследование и виртуальное наследование базовых классов. Использование виртуального механизма для реализации принципа полиморфизма.
- •48. Виртуальные методы класса и механизм их использования. Чисто виртуальные функции и абстрактные базовые классы.
- •49. Виртуальный деструктор. Абстрактные классы их назначение и свойства
- •50. Наследование виртуальных методов. Необходимость применения виртуальных функции. Полиморфизм и пуризм.
- •51. Понятие параметризированных функций. Параметризированные функции с двумя и более обобщенными типами. Перегрузка параметризированной функции.
- •126. Использование стандартных параметров в параметризированных функциях и методах. Особенности использования параметризированных функций и методов.
- •53. Параметризированные классы, методы, их свойства. Явно задаваемые специализации параметризированных классов
- •54. Совместное использование параметризации и принципов наследования.
- •55. Организация внешнего доступа к компонентам параметризированных классов. Параметризированные классы и статические элементы.
- •56. Использование в параметризированных классах аргументов, не являющихся типами. Использование в параметризированных классах аргументов по умолчанию.
- •133. Шаблоны класса и дружественные функции класса. Спецификатор register.
- •61. Причины использования многофайловых программ. Библиотеки классов. Реализация библиотек классов.
- •62. Создание многофайловой программы. Директории в многофайловой программе.
37. Наследование, базовый и производный классы. Иерархия классов
Наследование (inheritance) – это процесс создания новых классов, называемых наследниками или производными классами из уже существующих или базовых классов. Это так называемое повторное использование кода или code reuse. Производный класс получает все возможности базового класса, но может быть усовершенствован за счёт добавления новых возможностей. Базовый класс при этом остаётся неизменным. Наследование не работает в обратном направлении.
Выигрыш от наследования состоит в том, что можно код использовать несколько раз. Имея написанный и отлаженный базовый класс, мы можем его не модифицировать, при этом механизм наследования позволит приспособить базовый класс для работы в других различных ситуациях.
Основное достоинство наследования состоит в том, что оно позволяет создать базовый класс, который затем можно включить в состав более специализированных классов. Таким образом, каждый производный класс может служить определенной цели и при этом оставаться частью общей классификации.
Определение производного класса:
class CountDn : public Counter
Порядок вызова конструкторов соответствует порядку следования классов иерархии наследования. Порядок вызова деструктора всегда обратен порядку вызова конструктора: сначала вызывается деструктор наследника, а затем деструкторы всех базовых классов.
В качестве примера рассмотрим базу данных служащих некоторой компании. Для упрощения ситуации в ней существует только три категории служащих: менеджеры, занятые управлением, ученые, занятые исследованиями и разработкой товара компании, и рабочие, занятые изготовлением товара.
Пример нашей программы начинается с описания базового класса employee.
Этот класс содержит фамилии служащих и их номера. Он порождает три новых класса: manager, scientist и laborer. Классы manager и scientist содержат добавочную информацию об этих категориях служащих.
38. Определение производного класса, доступ к содержимому базового класса. Использование конструкторов, полей и методов базового класса.
Определение производного класса:
class CountDn : public Counter
Для этого используется знак двоеточия (не путать с двойным двоеточием, которое является операцией, использующейся для определения области действия), за ним следует ключевое слово public и имя базового класса Counter. Таким образом, мы установили отношение между классами.
Методы производного класса имеют доступ к элементам базового класса, которые объявлены со спецификатором public или protected. К элементам, объявленным в базовом классе как private методы производного класса доступа не имеют.
Для установки отношения наследования после название класса ставится двоеточие, затем идет название класса, от которого мы хотим унаследовать функциональность. В этом отношении класс Person еще будет называться базовым классом, а Employee - производным классом.
Перед названием базового класса также можно указать спецификатор доступа.
Важной особенностью производного класса, является то, что хоть он и может использовать все методы и элементы полей protected и public базового класса, но он не может обратиться к конструктору с параметрами. Если конструкторы в производном классе не определены, при создании объекта сработает конструктор без аргументов базового класса. А если нам надо сразу при создании объекта производного класса внести данные, то для него необходимо определить свои конструкторы.
В производном классе необходимо явно определять свои конструкторы, деструкторы и перегруженные операторы присваивания из-за того, что они не наследуются от базового класса. Но их можно вызвать явным образом при определении конструктора, деструктора или перегрузки оператора присваивания производного класса, например таким образом (для конструктора): Конструктор_Производного_Класса (/*параметры*/) : Конструктор_Базового_Класса ( /*параметры*/) { } .