Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции программирование / polevoy_cpp_2012_spring_lecture_09

.pdf
Скачиваний:
26
Добавлен:
20.04.2015
Размер:
125.84 Кб
Скачать

Объектно-ориентированное программирование

с использованием C++

Полевой Дмитрий Валерьевич к.т.н., доцент КиК

e-mail: oop.misis@gmail.com

Тип и класс

тип определяется интерфейсом, т.е. набором допустимых операций

класс реализует один или несколько типов

интерфейс класса м.б. шире, чем интерфейс типа

07.04.2012

cppNewb.ru

2

Повышающее приведение типа

интерпретация адреса экземпляра производного класса в качестве адреса экземпляра базового класса (через указатель или ссылку)

“ сужает” интерфейс производного класса до интерфейса базового

допустимо при соблюдении подстановочного принципа

07.04.2012

cppNewb.ru

3

Повышающее приведение типа (пример)

//class CStudent : public CMan

void

protocol(ostream& os, const CMan& man)

{

printHeader(os);

man.writeTxt(os);

printFooter(os);

}

07.04.2012

cppNewb.ru

4

Связывание

соотнесение вызова функции с телом функции

раннее связывание

реализуется компилятором и компоновщиком

до запуска программы (при “сборке”)

позднее (динамическое) связывание

осуществляется в процессе исполнения программы в зависимости от фактического типа экземпляра

07.04.2012

cppNewb.ru

5

Виртуальная функция

объявляется виртуальной в базовом классе с помощью ключевого слова virtual

связывается динамически при использовании адреса базового класса

остается виртуальной во всех производных классах (достаточно одного

объявления в базовом классе)

07.04.2012

cppNewb.ru

6

Использование virtual

избегайте использования virtual в определениях функций

избегайте использования virtual в объявлениях производных классов

переопределение – повторное определение виртуальной функции в производном классе

07.04.2012

cppNewb.ru

7

Виртуальная функция (пример)

class CMan

{

public:

virtual void writeTxt(ostream& os);

};

void CMan::writeTxt(ostream& os)

07.04.2012

cppNewb.ru

8

Расширяемость

универсальный код

взаимодействует только с интерфейсом типа (т.е. базового класса)

возможно добавление новых производных классов, без изменения универсального кода

07.04.2012

cppNewb.ru

9

Поиск тела виртуальной функции

компилятор гарантирует наличие тела для виртуальной функции

если виртуальная функция не переопределяется в классе, то вызывается “ближайшее” в иерархии наследования определение

07.04.2012

cppNewb.ru

10