polevoy_cpp_2012_spring_lecture_09
.pdfОбъектно-ориентированное программирование
с использованием 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 |