- •Оглавление
- •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.1. Пример иерархических структур классов
Рассмотрим схему г). Пусть объявлен объект производного класса cl2: cl2 obj2;. тогда он будет иметь две части в памяти:
элементы, унаследованные от cl1 (явное наследование);
собственные элементы класса cl2.
Аналогично объект класса cl5 будет иметь две части.
Пусть объявлен объект производного класса cl3: cl3 obj3;. Он будет уже иметь три части, т.е.:
элементы, унаследованные от cl1 (неявное наследование);
элементы, унаследованные от cl2 (явное наследование);
собственные элементы класса cl3.
Аналогично объекты классов cl4 и cl6 будут иметь три части. Возникает вопрос о доступе внутри производного класса к элементам этих частей, т.е. к собственным и наследуемым элементам. Доступ к собственным элементам осуществляется прямо по имени элемента. Хотя производный класс наследует все элементы базового класса, возможность доступа к наследуемым элементам управляется атрибутом наследования (см. схему выше). Если доступ возможен, то он производится прямо по имени элемента базового класса.
Неоднозначность доступа возникает, если в производном классе и базовом классе имеются элементы с одинаковыми именами. Тогда для доступа к наследуемому элементу необходимо использовать имя базового класса с операцией разрешения видимости.
Пример:
class cl1 class cl2: public cl1
{ {
public: int tabn;
int tabn; void f()
... {
}; tabn=10; //доступ к собств. элементу
cl1::tabn=20;//доступ к наслед. элементу
};
Конструктор производного класса выполняет следующее:
инициализирует собственные элементы;
инициализирует наследуемые элементы.
Производный класс может явно инициализировать наследуемые элементы только непосредственного базового класса. Для этого в списке инициализации конструктора производного класса должен быть явно указан прототип конструктора непосредственного базового класса. Таким образом, конструктор производного класса может содержать параметры для самого конструктора производного класса, так и параметры для конструктора базового класса.
Пример:
class index class akt:public index
{ {
protected: protected: char tabn[10]; char* imf;
int max; char tabn[10];
public: char* imf;
index(int mk):max(mk) public:
{} akt(char* imf,int m):imf(im),index(m)
... {tabn[0]=’\0’; }
}; };
Порядок выполнения конструкторов при наследовании следующий: сначала выполняются конструкторы базового класса, затем производного класса.
Деструкторы выполняются в порядке, обратном конструкторам. Деструктору производного класса не требуется явно иметь деструктор базового класса. Компилятор автоматически генерирует вызов базового деструктора.