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


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

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

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

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

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

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

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

Раздел 2. Лекция 08 Абстрактные классы и множественное наследование

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

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

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

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

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

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

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

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

программа

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

CALL Address

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

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

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

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

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

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

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

программа

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

CALL Address

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

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

Слайд 4ННГУ, ВМК, 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.

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

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

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

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

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

программа

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

CALL Address

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

?

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

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

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

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

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

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

?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сегодня мы изучим, как в C++ реализуются абстрактные классы и множественное наследование

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

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

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

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

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

Чисто виртуальные методы. Суть проблемы

Имея иерархию наследования, часто имеет смысл сосредоточить в базовом классе (вершине иерархии) основные функциональные элементы, которые впоследствии будут уточняться в потомках.

TBaseClass

Show()
Hide()
Save()
Load()

Будут у всех потомков

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

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

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

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

Выгода от использования такого подхода

Сделав методы виртуальными, Вы сможете писать так:






Разумеется, данные методы должны быть перекрыты в потомках, где в каждом конкретном случае прописана правильная функциональность.

TBaseClass *B[N];

for (int i=0; i B[i]->Load();

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

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

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

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

Чисто виртуальные методы. Суть проблемы

Имея иерархию наследования, часто имеет смысл сосредоточить в базовом классе (вершине иерархии) основные функциональные элементы, которые впоследствии будут уточняться в потомках.

TBaseClass

Show()
Hide()
Save()
Load()

?

А что писать в базовом классе в качестве реализации?

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

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

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

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

Возможный вариант 1

Первое, что приходит в голову – создание пустой реализации.
Пример:
class TBaseClass {
public:
virtual void Show() { };
};
Недостаток:
По смыслу этот метод не должен вызываться никогда, ибо он ничего не делает. Однако, существует возможность его вызвать – потенциальный источник логических ошибок.

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

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

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

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

Возможный вариант 2

Второе, что приходит в голову – создание реализации с сообщением об ошибке.
Пример:
class TBaseClass {
public:
virtual void Show() {
ShowMessage(“Какой ужас! Вызвали метод Show(), который был написан просто так ”);
};
};
Недостаток:
Представьте себе реакцию обычного пользователя на этот текст!

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

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

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

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

Возможный вариант 3

Третье, что приходит в голову – создание реализации с установлением некого признака ошибки.
Пример:
class TBaseClass {
public:
virtual void Show() {
FatalErrorNumber = 1;
IDontKnowWhatToDoNow(FatalErrorNumber);
};
};
Недостаток:
Придется вручную реализовывать хитроумный механизм обработки ошибок.

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

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

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

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

Итого:

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

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

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

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

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

Такой универсальный механизм в C++ присутствует. Он реализуется посредством чисто виртуальных функций и абстрактных классов.

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

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

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

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

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

Чисто виртуальная функция – метод, удовлетворяющий следующим параметрам:
Для него не указана реализация в классе, в котором он объявлен.
Вместо реализации (тела функции) указано =0.
Метод переопределяется далее в иерархии наследования.

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

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

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

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

Вид прототипа в объявлении класса

virtual <обычный прототип функции> = 0;

В данном случае мы имеем дело с фиктивной функцией. По-существу, мы отложили реализацию метода на потом.

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

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

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

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

Пример:

class TBaseClass {
public:
virtual void Show() = 0;
};

class TDerivedClass : public TBaseClass {
private:
// некоторые данные
public:
void Show() {
// Некоторый содержательный код
}
};

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

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

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

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

Абстрактные классы

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

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

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

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

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

Абстрактные классы. Смысл использования

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

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

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

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

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

Абстрактные классы. Некоторые дополнительные ограничения

абстрактный класс нельзя использовать при явном приведении типов, для описания типа параметра и типа возвращаемого функцией значения;
допускается объявлять указатели и ссылки на абстрактный класс, если при инициализации не требуется создавать временный объект;
если класс, производный от абстрактного, не определяет все чисто виртуальные функции, он также является абстрактным.

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

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

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

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

Абстрактные классы. Пример использования

Координатная плоскость.

1

2

3

4

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

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

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

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

Абстрактные классы. Пример использования

ФИГУРА

ТОЧКА

КРУГ

КВАДРАТ

схема выводимости

абстрактный класс

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

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

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

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

Абстрактные классы. Пример использования

TShape

TPoint

TCircle

TSquare

схема выводимости

абстрактный класс

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

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

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

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

Класс TShape

class TShape {
protected:
int visible;
public:
TShape(int _vis): visible(_vis) {}
virtual ~TShape() {}
virtual void Show() = 0;
int IsVisible() const {
return visible;
}
};

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

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

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

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

Класс TPoint

class TPoint : public TShape {
private:
int x, y;
public:
TPoint(int _x, int _y, int _vis): TShape(_vis), x(_x), y(_y) {}
void Show() {
if (!visible) {
printf("%d %d ", x, y);
visible = 1;
}
}
};

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

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

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

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

Класс TCircle

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

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

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

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

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

Простое наследование

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

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

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

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

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

Простое наследование

TShape

int visible

virtual void Show() = 0

int IsVisible() const

TPoint

int x, y;

void Show()

TCircle

int r;

void Show()

x

1

x

1

x

1

TRectangle

int a, b;

void Show()

x

1

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

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

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

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

Множественное наследование

Идея множественного наследования – создание потомков при помощи нескольких предков.
Пример:
Труба – стальной цилиндр с физическими свойствами соответствующей стали и геометрическими свойствами цилиндра.

x

y

z

o

сталь XXX

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

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

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

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

Пример

материал

сталь

фигура

цилиндр

труба

материальная часть

геометрическая часть

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

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

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

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

Синтаксис

class TMaterial { … };
class TSteel: public TMaterial { … };
class TShape { … };
class TCylinder: public TShape { … };

class TPipe: public TSteel, public TCylinder
{

};

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

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

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

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

Труба изнутри

Труба

Сталь

Цилиндр

Материал

Фигура




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

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

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

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

Пример

Можно придумать такой пример, когда экземпляр одного класса входит в итоговый объект неоднократно.
Пример:
class TSteel : public TMaterial { … };
class TPlastic : public TMaterial { … };
class TProduct :
public TSteel, public TPlastic {

};
Изделие состоит из стали и пластмассы.

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

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

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

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

Пример

TProduct

TSteel

TPlastic

TMaterial

TMaterial




Изделие состоит из стали и пластмассы! Каждый материал имеет свои свойства

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

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

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

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

Виртуальное наследование

Заметим, что экземпляр класса TMaterial входит в итоговый объект 2 раза. Если изделие состоит из двух частей, одна из которых стальная, а другая – пластмассовая, то все верно. Но как быть, если изделие по смыслу либо стальное, либо пластмассовое? В этом случае нам не нужно 2 экземпляра класса TMaterial.
На помощь приходит виртуальное наследование.

class TSteel : virtual public TMaterial { … };
class TPlastic : virtual public TMaterial { … };
class TProduct :
public TSteel, public TPlastic {

};

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

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

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

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

Пример

TProduct

TSteel

TPlastic

TMaterial



Изделие состоит либо из стали,
либо из пластмассы!


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

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

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

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

Плюсы и минусы множественного наследования

Реально, множественное наследование используется редко. Основные причины:
чаще всего без него можно обойтись, заменив агрегацией все ветки наследования, кроме одной;
множественное наследование порождает массу ситуаций, сложных для понимания. Так проблемы возникают при одинаковом наименовании членов класса в предках, порядке вызова конструкторов/деструкторов и т.д.

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

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

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

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

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

Далее мы узнаем про то, как работают шаблоны.

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

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

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

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

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

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

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

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

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

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

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


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

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