SlideShare a Scribd company logo
Модуль 3: Основные понятия объектно-ориентированного
программирования.
Темы лекции: Полиморфизм.
Практическое задание: Полиморфизм.
Тренер: Игорь Шкулипа, к.т.н.
C++ Базовый. Занятие 11
http://www.slideshare.net/IgorShkulipa 2
Преобразование типов
В С++ существуют операторы преобразования типов:
⚫ const_cast < > ( )
⚫ static_cast < > ( )
⚫ reinterpret_cast < > ( )
⚫ dynamic_cast < > ( )
http://www.slideshare.net/IgorShkulipa 3
const_cast
Оператор const_cast позволяет убрать или добавить
константность
const ClassA * constA = {/*инициализатор*/};
ClassA * A = const_cast<ClassA *>(constA);
const_cast не применим для тех объектов, которые объявлены
как const. В таком случае нельзя отменять константность, так
как будет undefined behaviour.
http://www.slideshare.net/IgorShkulipa 4
reinterpret_cast
Оператор reinterpret_cast приводит друг к другу указатели,
которые друг от друга не зависят, не меняя константности
ClassA * p = new ClassA();
double * d = reinterpret_cast<double*>(p);
Оператор reinterpret_cast является машинно-зависимым. Чтобы
безопасно использовать оператор reinterpret_cast, следует
хорошо понимать, как именно реализованы используемые
типы, а также то, как компилятор осуществляет приведение
http://www.slideshare.net/IgorShkulipa 5
static_cast
Оператор static_cast выполняет преобразование между
связанными значениями. Связанность проверяется на этапе
компиляции, поэтому и называется static.
//Класс Derived является наследником Base
Derived * der = ...;
Base * bas = static_cast<Base *>(der);
der = static_cast<Derived *>(bas);
Типы, к котрым применим static_cast:
⚫ числовые типы
⚫ классы, связанные наследованием
⚫ приведение к void*
http://www.slideshare.net/IgorShkulipa 6
dynamic_cast
Безопасное приведение по иерархии наследования.
dynamic_cast<Derived *>(base_pointer)
Используется RTTI (Runtime Type Information), чтобы привести
один указатель на объект класса к другому указателю на
объект класса.
Классы должны быть полиморфными, то есть в базовом классе
должна быть хотя бы одна виртуальная функция. Если это
условие не соблюдено, ошибка возникнет на этапе
компиляции. Если приведение невозможно, то об этом станет
ясно только на этапе выполнения программы и будет
возвращен NULL.
http://www.slideshare.net/IgorShkulipa 7
Полиморфизм
Полиморфизм - это свойство, которое позволяет одно и то же
имя использовать для решения нескольких схожих, но
технически разных задач. Целью полиморфизма является
использование одного имени для задания общих для класса
действий.
Использование полиморфизма достигается при присвоении
указателю на базовый класс адреса производного класса с
переопределенными методами.
Типы-наследники неявно приводимы к базовому классу.
http://www.slideshare.net/IgorShkulipa 8
Пример
class Point
{
private: double _x, _y;
...
}
class Figure
{
protected: Point _center;
public: double GetArea(){return 0;};
}
class Circle: public Figure
{
private: double _radius;
...
public: double GetArea(){return 3.14*_radius*_radius;};
}
class Rectangle: public Figure
{
private: double _width, _height;
...
public: double GetArea(){return _width*_height;};
}
Figure
Circle Rectangle
http://www.slideshare.net/IgorShkulipa 9
Результат 1
void main()
{
Circle circle(10);
Rectangle rectangle(10, 20);
cout << circle.GetArea() << "n";
cout << rectangle.GetArea() <<
"n";
return 0;
}
Результат:
>314
>200
http://www.slideshare.net/IgorShkulipa 10
Результат 2
void PrintArea(const Figure& figure)
{
cout << figure.GetArea() <<
"n";
}
void main()
{
Circle circle(10);
Rectangle rectangle(10, 20);
PrintShapeArea(circle);
PrintShapeArea(rectangle);
return 0;
}
Результат:
>0
>0
В данной ситуации при выборе вызываемых
методов компилятор руководствуется типом
ссылки.
В этом случае происходит вызов методов
класса Shape, так как функция PrintArea
принимает ссылку данного типа.
http://www.slideshare.net/IgorShkulipa 11
Виртуальные методы
Метод класса может быть объявлен виртуальным, если
допускается его альтернативная реализация в порожденном
классе.
При вызове виртуальной функции через указатель или ссылку на
объект базового класса будет вызвана реализация данной
функции, специфичная для фактического типа объекта.
Виртуальные функции обозначаются в объявлении класса при
помощи ключевого слова virtual.
Виртуальные функции позволяют использовать полиморфизм.
Полиморфизм позволяет осуществлять работу с разными
реализациями через один и тот же интерфейс.
http://www.slideshare.net/IgorShkulipa 12
Пример
class Figure
{
protected: Point _center;
public:
virtual double GetArea(){return 0;};
}
class Circle: public Figure
{
private: double _radius;
...
public:
virtual double GetArea(){return 3.14*_radius*_radius;};
}
class Rectangle: public Figure
{
private: double _width, _height;
...
public:
virtual double GetArea(){return _width*_height;};
}
http://www.slideshare.net/IgorShkulipa 13
Результат
void PrintArea(const Figure& figure)
{
cout << figure.GetArea() <<
"n";
}
void main()
{
Circle circle(10);
Rectangle rectangle(10, 20);
PrintShapeArea(circle);
PrintShapeArea(rectangle);
return 0;
}
Результат:
>314
>200
В данной ситуации при выборе вызываемых
методов компилятор руководствуется
таблицей виртуальных методов (VMT).
В этом случае происходит вызов методов
классов Circle и Rectangle, так как они
объявлены виртуальными.
http://www.slideshare.net/IgorShkulipa 14
Особенности виртуальных методов
В C++ методы, объявленные в базовом классе виртуальными,
остаются виртуальными в классах-потомках.
Использовать слово virtual в классах наследниках не
обязательно (хотя и желательно для лучшего понимания кода).
В C++ виртуальные функции не являются виртуальными, если
они вызваны в конструкторе или деструкторе данного класса.
http://www.slideshare.net/IgorShkulipa 15
Виртуальный деструктор
Деструктор класса, имеющего наследников, всегда должен явно
объявляться виртуальным.
Это обеспечивает корректный вызов деструктора нужного класса
при вызове оператора delete с указателем на базовый класс.
Деструктор, не объявленный явно виртуальным, а также
автоматически сгенерированный деструктор является не
виртуальным.
Классы без виртуальных деструкторов не предназначены для
расширения.
Классы стандартных коллекций STL (строки, векторы) не имеют
виртуальных деструкторов, поэтому наследоваться от них нельзя.
http://www.slideshare.net/IgorShkulipa 16
Абстрактные классы
Возможны ситуации, когда базовый класс представляет собой
абстрактное понятие, и выступает лишь как базовый класс
(интерфейс) для производных классов.
Какова площадь объекта «Figure» и как его нарисовать?
Такие виртуальные функции следует объявлять чисто
виртуальными (pure virtual), добавив инициализатор =0,
опустив тело функции.
Класс является абстрактным, если в нем содержится хотя бы
одна чисто виртуальная функция, либо он не реализует хотя
бы одну чисто виртуальную функцию своего родителя.
Экземпляр абстрактного класса создать невозможно
http://www.slideshare.net/IgorShkulipa 17
Пример
class Figure
{
public:
virtual double GetArea()=0;
virtual void Draw()=0;
};
http://www.slideshare.net/IgorShkulipa 18
Интерфейс
Интерфейс - абстрактный класс, содержащий только чисто
виртуальные методы.
Невозможно создать экземпляр интерфейса.
Все методы интерфейса должны быть реализованы в
производных классах.
Деструктор такого класса обязательно должен быть
виртуальным.
http://www.slideshare.net/IgorShkulipa 19
Пример
class IFigure
{
public:
virtual double GetArea()=0;
virtual void Draw()=0;
virtual void Transform()=0;
virtual void Move()=0;
};
http://www.slideshare.net/IgorShkulipa 20
Лабораторная работа №11. Полиморфизм
Написать программу с использованием наследования классов,
реализующую классы:
⚫ графический объект (интерфейс)
⚫ правильный треугольник
⚫ квадрат
⚫ правильный пятиугольник
⚫ правильный N-угольник
Реализовать полиморфный метод подсчета площади.

More Related Content

What's hot

C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
Igor Shkulipa
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5Technopark
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3Technopark
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
Anton Moiseenko
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
metaform
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
Anton Moiseenko
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9Technopark
 
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFШаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFSergey Nemchinsky
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
Ural Federal University named after First President of Russia B.N. Yeltsin
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
Igor Shkulipa
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. Intro
Anton Moiseenko
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
Anton Moiseenko
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.
Igor Shkulipa
 

What's hot (20)

C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFШаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. Intro
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.
 

Viewers also liked

Organists Review.compressed
Organists Review.compressedOrganists Review.compressed
Organists Review.compressedJamie Singleton
 
Production diary 20
Production diary 20Production diary 20
Production diary 20
Laila Jaleel
 
C# Web. Занятие 01.
C# Web. Занятие 01.C# Web. Занятие 01.
C# Web. Занятие 01.
Igor Shkulipa
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
Igor Shkulipa
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
Igor Shkulipa
 
Production diary 5
Production diary 5Production diary 5
Production diary 5
Laila Jaleel
 
C++ Базовый. Занятие 06.
C++ Базовый. Занятие 06.C++ Базовый. Занятие 06.
C++ Базовый. Занятие 06.
Igor Shkulipa
 
C# Desktop. Занятие 10.
C# Desktop. Занятие 10.C# Desktop. Занятие 10.
C# Desktop. Занятие 10.
Igor Shkulipa
 
5 niveles de prevension
5  niveles de prevension5  niveles de prevension
5 niveles de prevension
Jhon Boza Gomez
 
Brochure – Massey University Business School
Brochure – Massey University Business SchoolBrochure – Massey University Business School
Brochure – Massey University Business School
Rick Petford
 
Production diary 14
Production diary 14Production diary 14
Production diary 14
Laila Jaleel
 
Production diary 11
Production diary 11Production diary 11
Production diary 11
Laila Jaleel
 
10 Reasons to Trademark Your Business
10 Reasons to Trademark Your Business10 Reasons to Trademark Your Business
10 Reasons to Trademark Your Business
The Trademark Helpline
 
Biotecnología
BiotecnologíaBiotecnología
Biotecnología
karolinadiaz2015
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.
Igor Shkulipa
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.
Igor Shkulipa
 
Production diary 4
Production diary 4Production diary 4
Production diary 4
Laila Jaleel
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.
Igor Shkulipa
 
Time Out - A beginners guide to meditation for self care
Time Out - A beginners guide to meditation for self careTime Out - A beginners guide to meditation for self care
Time Out - A beginners guide to meditation for self care
Andrea Fortuin
 

Viewers also liked (20)

Organists Review.compressed
Organists Review.compressedOrganists Review.compressed
Organists Review.compressed
 
Production diary 20
Production diary 20Production diary 20
Production diary 20
 
C# Web. Занятие 01.
C# Web. Занятие 01.C# Web. Занятие 01.
C# Web. Занятие 01.
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
 
Production diary 5
Production diary 5Production diary 5
Production diary 5
 
C++ Базовый. Занятие 06.
C++ Базовый. Занятие 06.C++ Базовый. Занятие 06.
C++ Базовый. Занятие 06.
 
C# Desktop. Занятие 10.
C# Desktop. Занятие 10.C# Desktop. Занятие 10.
C# Desktop. Занятие 10.
 
5 niveles de prevension
5  niveles de prevension5  niveles de prevension
5 niveles de prevension
 
Brochure – Massey University Business School
Brochure – Massey University Business SchoolBrochure – Massey University Business School
Brochure – Massey University Business School
 
Production diary 14
Production diary 14Production diary 14
Production diary 14
 
Production diary 11
Production diary 11Production diary 11
Production diary 11
 
10 Reasons to Trademark Your Business
10 Reasons to Trademark Your Business10 Reasons to Trademark Your Business
10 Reasons to Trademark Your Business
 
Biotecnología
BiotecnologíaBiotecnología
Biotecnología
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.
 
Brochure
BrochureBrochure
Brochure
 
Production diary 4
Production diary 4Production diary 4
Production diary 4
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.
 
Time Out - A beginners guide to meditation for self care
Time Out - A beginners guide to meditation for self careTime Out - A beginners guide to meditation for self care
Time Out - A beginners guide to meditation for self care
 

Similar to C++ Базовый. Занятие 11.

C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
Igor Shkulipa
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Dima Dzuba
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.
Igor Shkulipa
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Javaitc73
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
Lec 2
Lec 2Lec 2
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
Sergey Schetinin
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
mcroitor
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
Andrey Gordienkov
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
Andrey Gordienkov
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
AvitoTech
 
Grails & Groovy
Grails & GroovyGrails & Groovy
Grails & Groovy
Denys Sosuliev
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.
Igor Shkulipa
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.
Igor Shkulipa
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9Technopark
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
Igor Shkulipa
 

Similar to C++ Базовый. Занятие 11. (20)

C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Lec 2
Lec 2Lec 2
Lec 2
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
Grails & Groovy
Grails & GroovyGrails & Groovy
Grails & Groovy
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 

More from Igor Shkulipa

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03.
Igor Shkulipa
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
Igor Shkulipa
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.
Igor Shkulipa
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.
Igor Shkulipa
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
Igor Shkulipa
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
Igor Shkulipa
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.
Igor Shkulipa
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
Igor Shkulipa
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
Igor Shkulipa
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
Igor Shkulipa
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
Igor Shkulipa
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
Igor Shkulipa
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
Igor Shkulipa
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.
Igor Shkulipa
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
Igor Shkulipa
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
Igor Shkulipa
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
Igor Shkulipa
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.
Igor Shkulipa
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
Igor Shkulipa
 
C# Web. Занятие 10.
C# Web. Занятие 10.C# Web. Занятие 10.
C# Web. Занятие 10.
Igor Shkulipa
 

More from Igor Shkulipa (20)

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03.
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
 
C# Web. Занятие 10.
C# Web. Занятие 10.C# Web. Занятие 10.
C# Web. Занятие 10.
 

C++ Базовый. Занятие 11.

  • 1. Модуль 3: Основные понятия объектно-ориентированного программирования. Темы лекции: Полиморфизм. Практическое задание: Полиморфизм. Тренер: Игорь Шкулипа, к.т.н. C++ Базовый. Занятие 11
  • 2. http://www.slideshare.net/IgorShkulipa 2 Преобразование типов В С++ существуют операторы преобразования типов: ⚫ const_cast < > ( ) ⚫ static_cast < > ( ) ⚫ reinterpret_cast < > ( ) ⚫ dynamic_cast < > ( )
  • 3. http://www.slideshare.net/IgorShkulipa 3 const_cast Оператор const_cast позволяет убрать или добавить константность const ClassA * constA = {/*инициализатор*/}; ClassA * A = const_cast<ClassA *>(constA); const_cast не применим для тех объектов, которые объявлены как const. В таком случае нельзя отменять константность, так как будет undefined behaviour.
  • 4. http://www.slideshare.net/IgorShkulipa 4 reinterpret_cast Оператор reinterpret_cast приводит друг к другу указатели, которые друг от друга не зависят, не меняя константности ClassA * p = new ClassA(); double * d = reinterpret_cast<double*>(p); Оператор reinterpret_cast является машинно-зависимым. Чтобы безопасно использовать оператор reinterpret_cast, следует хорошо понимать, как именно реализованы используемые типы, а также то, как компилятор осуществляет приведение
  • 5. http://www.slideshare.net/IgorShkulipa 5 static_cast Оператор static_cast выполняет преобразование между связанными значениями. Связанность проверяется на этапе компиляции, поэтому и называется static. //Класс Derived является наследником Base Derived * der = ...; Base * bas = static_cast<Base *>(der); der = static_cast<Derived *>(bas); Типы, к котрым применим static_cast: ⚫ числовые типы ⚫ классы, связанные наследованием ⚫ приведение к void*
  • 6. http://www.slideshare.net/IgorShkulipa 6 dynamic_cast Безопасное приведение по иерархии наследования. dynamic_cast<Derived *>(base_pointer) Используется RTTI (Runtime Type Information), чтобы привести один указатель на объект класса к другому указателю на объект класса. Классы должны быть полиморфными, то есть в базовом классе должна быть хотя бы одна виртуальная функция. Если это условие не соблюдено, ошибка возникнет на этапе компиляции. Если приведение невозможно, то об этом станет ясно только на этапе выполнения программы и будет возвращен NULL.
  • 7. http://www.slideshare.net/IgorShkulipa 7 Полиморфизм Полиморфизм - это свойство, которое позволяет одно и то же имя использовать для решения нескольких схожих, но технически разных задач. Целью полиморфизма является использование одного имени для задания общих для класса действий. Использование полиморфизма достигается при присвоении указателю на базовый класс адреса производного класса с переопределенными методами. Типы-наследники неявно приводимы к базовому классу.
  • 8. http://www.slideshare.net/IgorShkulipa 8 Пример class Point { private: double _x, _y; ... } class Figure { protected: Point _center; public: double GetArea(){return 0;}; } class Circle: public Figure { private: double _radius; ... public: double GetArea(){return 3.14*_radius*_radius;}; } class Rectangle: public Figure { private: double _width, _height; ... public: double GetArea(){return _width*_height;}; } Figure Circle Rectangle
  • 9. http://www.slideshare.net/IgorShkulipa 9 Результат 1 void main() { Circle circle(10); Rectangle rectangle(10, 20); cout << circle.GetArea() << "n"; cout << rectangle.GetArea() << "n"; return 0; } Результат: >314 >200
  • 10. http://www.slideshare.net/IgorShkulipa 10 Результат 2 void PrintArea(const Figure& figure) { cout << figure.GetArea() << "n"; } void main() { Circle circle(10); Rectangle rectangle(10, 20); PrintShapeArea(circle); PrintShapeArea(rectangle); return 0; } Результат: >0 >0 В данной ситуации при выборе вызываемых методов компилятор руководствуется типом ссылки. В этом случае происходит вызов методов класса Shape, так как функция PrintArea принимает ссылку данного типа.
  • 11. http://www.slideshare.net/IgorShkulipa 11 Виртуальные методы Метод класса может быть объявлен виртуальным, если допускается его альтернативная реализация в порожденном классе. При вызове виртуальной функции через указатель или ссылку на объект базового класса будет вызвана реализация данной функции, специфичная для фактического типа объекта. Виртуальные функции обозначаются в объявлении класса при помощи ключевого слова virtual. Виртуальные функции позволяют использовать полиморфизм. Полиморфизм позволяет осуществлять работу с разными реализациями через один и тот же интерфейс.
  • 12. http://www.slideshare.net/IgorShkulipa 12 Пример class Figure { protected: Point _center; public: virtual double GetArea(){return 0;}; } class Circle: public Figure { private: double _radius; ... public: virtual double GetArea(){return 3.14*_radius*_radius;}; } class Rectangle: public Figure { private: double _width, _height; ... public: virtual double GetArea(){return _width*_height;}; }
  • 13. http://www.slideshare.net/IgorShkulipa 13 Результат void PrintArea(const Figure& figure) { cout << figure.GetArea() << "n"; } void main() { Circle circle(10); Rectangle rectangle(10, 20); PrintShapeArea(circle); PrintShapeArea(rectangle); return 0; } Результат: >314 >200 В данной ситуации при выборе вызываемых методов компилятор руководствуется таблицей виртуальных методов (VMT). В этом случае происходит вызов методов классов Circle и Rectangle, так как они объявлены виртуальными.
  • 14. http://www.slideshare.net/IgorShkulipa 14 Особенности виртуальных методов В C++ методы, объявленные в базовом классе виртуальными, остаются виртуальными в классах-потомках. Использовать слово virtual в классах наследниках не обязательно (хотя и желательно для лучшего понимания кода). В C++ виртуальные функции не являются виртуальными, если они вызваны в конструкторе или деструкторе данного класса.
  • 15. http://www.slideshare.net/IgorShkulipa 15 Виртуальный деструктор Деструктор класса, имеющего наследников, всегда должен явно объявляться виртуальным. Это обеспечивает корректный вызов деструктора нужного класса при вызове оператора delete с указателем на базовый класс. Деструктор, не объявленный явно виртуальным, а также автоматически сгенерированный деструктор является не виртуальным. Классы без виртуальных деструкторов не предназначены для расширения. Классы стандартных коллекций STL (строки, векторы) не имеют виртуальных деструкторов, поэтому наследоваться от них нельзя.
  • 16. http://www.slideshare.net/IgorShkulipa 16 Абстрактные классы Возможны ситуации, когда базовый класс представляет собой абстрактное понятие, и выступает лишь как базовый класс (интерфейс) для производных классов. Какова площадь объекта «Figure» и как его нарисовать? Такие виртуальные функции следует объявлять чисто виртуальными (pure virtual), добавив инициализатор =0, опустив тело функции. Класс является абстрактным, если в нем содержится хотя бы одна чисто виртуальная функция, либо он не реализует хотя бы одну чисто виртуальную функцию своего родителя. Экземпляр абстрактного класса создать невозможно
  • 18. http://www.slideshare.net/IgorShkulipa 18 Интерфейс Интерфейс - абстрактный класс, содержащий только чисто виртуальные методы. Невозможно создать экземпляр интерфейса. Все методы интерфейса должны быть реализованы в производных классах. Деструктор такого класса обязательно должен быть виртуальным.
  • 19. http://www.slideshare.net/IgorShkulipa 19 Пример class IFigure { public: virtual double GetArea()=0; virtual void Draw()=0; virtual void Transform()=0; virtual void Move()=0; };
  • 20. http://www.slideshare.net/IgorShkulipa 20 Лабораторная работа №11. Полиморфизм Написать программу с использованием наследования классов, реализующую классы: ⚫ графический объект (интерфейс) ⚫ правильный треугольник ⚫ квадрат ⚫ правильный пятиугольник ⚫ правильный N-угольник Реализовать полиморфный метод подсчета площади.