Разделы презентаций


Методы программирования (2 семестр)

ННГУ, ВМК, 2004 г. Методы программирования 2. ООП Л. 01. Введение в ООП. Мееров И.Б.Краткое содержание предыдущей серииВажная проблема: типов абстракций

Слайды и текст этой презентации

Слайд 1ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Методы программирования (2 семестр)

Раздел 2. Лекция 07 Виртуальные методы

Нижегородский государственный университет
им. Н.И. Лобачевского

Факультет вычислительной математики и кибернетики

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 2ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Краткое содержание предыдущей серии

Важная проблема: типов абстракций (классов) слишком много. Чаще всего их настолько много, что мы не можем одновременно удерживать в голове информацию о них.
Решение, часть I: инкапсуляция позволяет скрыть внутренние детали абстракций и уменьшить объем информации, необходимый для понимания задачи.
Решение, часть II: что делать со сложными задачами известно еще с древних времен. Один из основных принципов: “Разделяй и властвуй!” (Модульная структура).

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 3ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Краткое содержание предыдущей серии

Важная проблема: типов абстракций (классов) слишком много. Чаще всего их настолько много, что мы не можем одновременно удерживать в голове информацию о них.
Решение, часть III: по мнению специалистов, “значительное упрощение в понимании сложных задач достигается за счет образования из абстракций иерархической структуры” (Grady Booch).

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 4ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Виды иерархий

Можно обнаружить 2 вида иерархий:
“Это есть…”
“Быть частью”.
Пример:
Круг и точка.
Два варианта представления:
Круг – это такая точка, у которой, кроме того, что есть у точки, есть еще радиус 
Круг – это точка + радиус.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 5ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Наследование и агрегация

ЭТО ЕСТЬ…

БЫТЬ ЧАСТЬЮ…

НАСЛЕДОВАНИЕ

АГРЕГАЦИЯ

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 6ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Примеры иерархий. Координатная плоскость

Точка: (x, y)
Круг: (x, y, R)
Эллипс: (x, y, R1, R2)
Квадрат: (x, y, a)
Прямоугольник: (x, y, a, b).
Треугольник:(x1,y1, x2,y2, x3,y3)
Координатная плоскость (набор фигур)

Агрегация

Наследование

ТОЧКА (x, y)

КРУГ (R)

ФИГУРА

ИЛИ:

ТОЧКА (x, y)

КРУГ (R)

КВАДРАТ (a)


ТРЕУГОЛЬНИК = ТОЧКА + ТОЧКА + ТОЧКА

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 7ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Наследование в C++. Основные идеи

Новые классы образуются при помощи старых, заимствуя все поля методы и реализуя некоторую новую функциональность.
Классы, находящиеся в вершине иерархии, объединяют в себе некоторое количество свойств, общих для всей иерархии.
Постепенно, спускаясь по иерархии вниз, мы добиваемся все большей детализации.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 8ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Дальнейшее изучение

Сегодня мы изучим, как в C++ реализуется полиморфизм при помощи механизма виртуальных методов.

Итак, за дело!

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 9ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

О способах вызова метода

До сих пор мы были знакомы со следующим способом принятия решения о вызове функции: адрес определяется на этапе компиляции.

программа

подпрограмма

CALL Address

Address, определяется на этапе компиляции

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 10ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

О способах вызова метода

Проблема: что делать, если специфика задачи такова, что на этапе компиляции адрес вызываемой подпрограммы неизвестен?

программа

подпрограммы

CALL Address

Address, на этапе компиляции неизвестен

?

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 11ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

О способах вызова метода

А такое вообще бывает?

Умный человек способен обнаружить проблему даже там, где ее нет! 

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 12ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

О способах вызова метода

Оказывается, такие случаи бывают.
Пример:
class TPoint имеет метод для рисования
void Show()
class TCircle (выведен из TPoint) должен иметь метод для рисования.
Вопрос 1: как его назвать?
Ответ: полиморфизм: мы называем метод void Show(), сохраняя удобное и естественное название.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 13ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Виртуальные методы

Вопрос 2: как это работает?
Ответ: в этом случае при наследовании реализуется замещение метода Show() класса TPoint новой реализацией метода Show() для класса TCircle.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 14ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Как это работает? (Замещение метода)

TPoint

TCircle

TPoint p1, p2;
TCircle c1, c2;

x

y

Show()


Show()

x

y

методы

x

y

r

Show()


методы

x

y

r

Show()

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 15ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Как это работает? (Раннее связывание)

В данном случае при компиляции работает т.н. механизм “раннего связывания”, который подразумевает, что адрес вызываемого метода определяется на этапе компиляции программы.

программа

подпрограмма

CALL Address

Address, определяется на этапе компиляции

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 16ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

А хорошо ли это?

Обычно замещение отрабатывает нормально.
В соответствии с принципом замещения происходит переопределение методов базовых классов, что позволяет наряду с реализацией новых возможностей по-другому реализовать те функции, которые уже существовали у базовых абстракций.
Однако, существуют ситуации, когда этого оказывается недостаточно.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 17ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

И снова пример

Вернемся к TPoint и TCircle.
Пусть нам необходимо реализовать класс “Координатная плоскость”. Основные данные: массив фигур.
Проблема 1: как описать это синтаксически?
TPoint *data[N]; TCircle *data[N]; void *data[N];

?

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 18ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

И снова пример

Вернемся к TPoint и TCircle.
Пусть нам необходимо реализовать класс “Координатная плоскость”. Основные данные: массив фигур.
Проблема 2: Пусть нам необходимо реализовать рисование всех фигур на координатной плоскости.
Надо бы написать:
for (i = 0; i < N; i++) data[i]->Show();
Вопрос: как на этапе компиляции определить, чей именно Show() нужно вызывать?

?

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 19ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Проблема 1. Решение

Для решения проблемы с объявлением данных в C++ принято следующее соглашение:

указателю на базовый класс можно присвоить значение адреса объекта любого производного класса

Итог:
TPoint *data[N]; // правильное объявление

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 20ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Проблема 1. Решение

class TPlane {
public:
TPoint *data[N]; // массив фигур

};

В последствии в переменную data можно записывать как адреса объектов класса TPoint, так и адреса объектов всех производных типов, в т.ч. и TCircle.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 21ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Проблема 1. Решение

Внимание: на этапе компиляции распределение точек и кругов в массиве неизвестно.


круг

точка

точка

круг

точка

data

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 22ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Примеры

TPoint *p[20];
TPoint p1(2, 3);
TCircle c1(2, 2, 1);

p[1] = &p1;
p[5] = &c1;


TCircle *p[20];
TPoint p1(2, 3);
TCircle c1(2, 2, 1);

p[1] = &p1; // Ошибка
p[5] = &c1;


ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 23ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Проблема 2. Решение (позднее связывание)

Итак, теперь мы создали класс “Координатная плоскость” и хотим реализовать там метод Show(), который вызывает метод Show() для всех находящихся на плоскости фигур.
Проблема в том, что на этапе компиляции неизвестно, метод какого класса нужно вызывать.
Решение: механизм позднего связывания. Главная идея – адрес вызываемого метода определяется динамически, во время работы программы.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 24ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Позднее связывание в C++

В C++ концепция позднего связывания реализуется использованием т.н. виртуальных методов.
Виртуальный метод:
объявлен с ключевым словом virtual в базовом классе;
во всех производных классах его прототип в точности совпадает с прототипом метода в базовом классе.
virtual <тип_рез> <Имя_метода>(<список_парам>);

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 25ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Пример (TPoint)

class TPoint {
private:
int x, y;
protected:
visible;
public:
TPoint(int _x = 0, int _y = 0, _vis = 0):
x(_x), y(_y), visible(_vis) {}
~TPoint() {};
int IsVisible() const { return visible; }
virtual void Show() { if (!visible) {
printf("%d %d ", x, y); visible = 1; }
}
};

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 26ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Пример (TCircle)

class TCircle: public TPoint {
private:
int r;
public:
TCircle(int _x = 0, int _y = 0, _r = 0, _vis = 0):
TPoint(_x, _y, _vis), r(_r) {}
~TCircle() {};
void Show() {
if (!visible) {
TPoint::Show(); printf("%d ", r);
}}
};

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 27ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Пример (TPlane)

class TPlane {
public:
int n; // количество фигур
TPoint *data[N]; // массив фигур
void ShowAll();

};
void TPlane::ShowAll() {
for (int i=0; i data[i]->Show();
}

методы Show() виртуальные.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 28ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Замечания _1

Если в базовом классе метод определен как виртуальный, метод, определенный в производном классе с тем же именем и набором параметров, автоматически становится виртуальным, а с отличающимся набором параметров – обычным.
Виртуальные методы наследуются, то есть переопределять их в производном классе требуется только при необходимости задать отличающиеся действия.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 29ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Замечания _2

Если виртуальный метод переопределен в производном классе, объекты этого класса могут получить доступ к методу базового класса с помощью операции доступа к области видимости.
TCircle C(1, 2 ,3);
C.TPoint::Show();
Виртуальный метод не может объявляться с модификатором static, но может быть объявлен как дружественный.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 30ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Замечания _3

Виртуальность обеспечивает то, что программа не реагирует на тип указателя. Программа реагирует на тип объекта, который окажется во время работы программы по данному адресу. В этом и заключается суть “позднего связывания”.
При доступе через объект, а не через указатель виртуальность не работает.
Пример: TPoint p[20]; p[2].Show(); // вызывается TPoint::Show()
Виртуальность не работает в конструкторе класса.
Для работы механизма позднего связывания создается специальная “Таблица виртуальных методов” (vtbl).

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 31ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Замечания _4

Для каждого класса (не объекта!), содержащего хотя бы один виртуальный метод, компилятор создает таблицу виртуальных методов (vtbl), в которой для каждого виртуального метода записан его адрес в памяти.
Адреса методов содержатся в таблице в порядке их описания в классах.
Адрес любого виртуального метода имеет в vtbl одно и то же смещение для каждого класса в пределах иерархии.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 32ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Замечания _5

Каждый объект содержит скрытое дополнительное поле ссылки на vtbl, называемое vptr. Оно заполняется конструктором при создании объекта (для этого компилятор добавляет в начало тела конструктора соответствующие инструкции).
На этапе компиляции ссылки на виртуальные методы заменяются на обращения к vtbl через vptr объекта, а на этапе выполнения в момент обращения к методу его адрес выбирается из таблицы. Таким образом, вызов виртуального метода, в отличие от обычных методов и функций, выполняется через дополнительный этап получения адреса метода из таблицы. Это несколько замедляет выполнение программы.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 33ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Какие методы делать виртуальными?

Виртуальность отрицательно сказывается на быстродействии программы, поэтому методы имеет смысл делать виртуальными тогда и только тогда, когда это действительно необходимо (см. пример).
Важный частный случай: во многих реализациях деструкторы объявляются виртуальными по всей иерархии наследования.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 34ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Следующая тема

Далее мы узнаем, про абстрактные классы и множественное наследование.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 35ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Павловская Т.А. C/C++ Программирование на языке высокого уровня.
Ален И. Голуб. Правила программирования на C/C++.
Гради Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на C++.
Из книг заимствованы различные идеи, элементы текста.
http://lye.upnet.ru
http://xaxa.h1.ru/jokes.html

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика