- •Оглавление
- •1 Основные методы программирования. Лекция №2 5
- •2 Методы объектно-ориентированного программирования. Лекция №6. 15
- •2.4 Вопросы по теме 54
- •3 Объектно-ориентированное проектирование. Лекция №12 55
- •3.4 Вопросы по теме 74
- •Введение. Лекция №1.
- •1Основные методы программирования. Лекция №2
- •1.1Процедурное программирование Методы процедурного программирования
- •Этапы разработки программ. Лекция 3.
- •1.2Объектно-ориентированное программирование Лекция №4
- •Этапы разработки оо программ. Лекция №5
- •Конструкторы и деструкторы. Лекция №7.
- •Друзья класса
- •2.2Наследование. Лекция №8
- •Производный класс
- •Простое наследование
- •Множественное наследование. Лекция №9
- •Виртуальные базовые классы
- •2.3Полиморфизм. Лекция №10
- •Перегрузка операций
- •Преобразования типов, определяемые классом
- •Перегрузка функций.
- •Чистый полиморфизм
- •Виртуальные элементы-функции
- •Абстрактные классы. Лекция №11.
- •Параметрический полиморфизм
- •Шаблоны функций
- •Шаблоны классов
- •2.4Вопросы по теме
- •3Объектно-ориентированное проектирование. Лекция №12
- •3.1Концепция объектно-ориентированного проектирования
- •3.2Проектирование структурной схемы программы Составление начальной иерархии и структуры классов
- •Реорганизация иерархии и структуры классов
- •Организационная структура программы
- •3.3Проектирование файлов интерфейсов классов. Лекция № 13. Файл интерфейса базового класса
- •Файлы интерфейсов производных классов
- •Файл управления
- •3.4Вопросы по теме
- •Общие моменты разработки программы на основе объектно-ориентированного подхода
- •Приложение а
2.2Наследование. Лекция №8
Наследование - это порождение производных классов от базовых классов, причем производный класс наследует элементы базовых классов и имеет собственные элементы.
Производный класс
Синтаксис определения производного класса:
class cl3: atr1 cl1[, atr2 cl2]//cl1 - имя базового класса
{ //atr1 - атрибут наследования (private, public, protected)
... }
Атрибут наследования осуществляет управление доступом к элементам базового класса (наследуемым элементам) внутри производного класса и влияет на дальнейшее наследование. По умолчанию атрибут наследования - private.
Схема управления доступом в производном классе к наследуемым элементам показана в таблице 2.1.
Таблица 2.1. Изменение атрибутов доступа при наследовании.
Атрибут наследования |
Атрибут доступа в базовом классе |
Прямой доступ в производном классе к наследуемым элементам (по имени элем.) |
private |
private protected public |
private, доступа нет варианты: 1 private, но доступ есть 2 private, но доступ есть 2 |
protected |
private protected public |
private, доступа нет 1 protected, доступ есть 3 protected, доступ есть 3 |
public |
private protected public |
private, доступа нет 1 protected, доступ есть 4 public, доступ есть 4 |
Как видно из таблицы, возможны следующие варианты доступа:
закрытые (private) элементы базового класса, независимо от атрибута наследования, становятся закрытыми (private) в производном классе, и к ним нет доступа в производном классе;
открытые (public) и защищенные (protected) элементы базового класса при наследовании private становятся закрытыми (private) в производном классе, но доступ к ним в производном классе есть; они становятся закрытыми от дальнейшего наследования;
открытые (public) и защищенные (protected) элементы базового класса при наследовании protected становятся эащищенными (protected) в производном классе;
открытые (public) и защищенные (protected) элементы базового класса при наследовании public становятся соответственно открытыми (public) и защищенными (protected) в производном классе.
Схема управления доступом на условном примере (см. таблицу 2.2).
Таблица 2.2. Пример осуществления доступа к элементам базового класса.
class cl1 //баз. класс { private: int a1; void x1(); protected: int b1;void y1(); public: int c1; void z1(); }; |
class cl2:public cl1//пр.кл { private: int a2; void x2(); protected: int b2;void y2(); public: int c2; void z2(); }; |
class cl3:private cl1//пр.кл { private: int a3; void x3(); protected: int b3;void y3(); public: int c3; void z3(); }; |
Прямой доступ в cl1: a1, x1(), b1, y1(), c1, z1() |
Прямой доступ в cl2: b1, y1(), c1, z1(), a2, x2(), b2, y2(), c2, z2() |
Прямой доступ в cl3: b1, y1(), c1, z1(), a3, x3(), b3, y3(), c3, z3() |
Доступ из внеш.функций через объект (cl1 obj1): c1, z1() |
Доступ из внеш.функций через объект (cl2 obj2): c1, z1(), c2, z2() |
Доступ из внеш.функций через объект (cl3 obj3): c3, z3() |
Определение каждого класса размещают в отдельном файле заголовков. Тогда в файл заголовков производного класса директивой #include необходимо включить файл заголовков базового класса.