Презентация Polymorphism. Создание проекта онлайн
На нашем сайте вы можете скачать и просмотреть онлайн доклад-презентацию на тему Polymorphism. Создание проекта абсолютно бесплатно. Урок-презентация на эту тему содержит всего 47 слайдов. Все материалы созданы в программе PowerPoint и имеют формат ppt или же pptx. Материалы и темы для презентаций взяты из открытых источников и загружены их авторами, за качество и достоверность информации в них администрация сайта не отвечает, все права принадлежат их создателям. Если вы нашли то, что искали, отблагодарите авторов - поделитесь ссылкой в социальных сетях, а наш сайт добавьте в закладки.
Презентации » Устройства и комплектующие » Polymorphism. Создание проекта
Оцените!
Оцените презентацию от 1 до 5 баллов!
- Тип файла:ppt / pptx (powerpoint)
- Всего слайдов:47 слайдов
- Для класса:1,2,3,4,5,6,7,8,9,10,11
- Размер файла:673.00 kB
- Просмотров:102
- Скачиваний:0
- Автор:неизвестен
Слайды и текст к этой презентации:
№2 слайд
![Предупреждение В данной](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img1.jpg)
Содержание слайда: Предупреждение
В данной презентации почти все примеры кода написаны на языке С++. Примеры рабочие, и будут запускаться в IDE Microsoft Visual Studio 2013/2015.
Язык C++, по сравнению с Java, предоставляет более широкий выбор инструментов для понимания того, что происходит «под капотом» программы. Наличие в нём операторов для получения адресов объектов в памяти и определения точного размера объектов в байтах, простое переключение между ранним и поздним связыванием, работа с таблицей виртуальных методов в отладчике, позволит понять новую тему во всех деталях.
№7 слайд
![Работа примера Каждый класс,](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img6.jpg)
Содержание слайда: Работа примера
Каждый класс, отнаследованный от Transport, получает метод Drive. (т.е., наследники обладают общим интерфейсом). Однако, каждое конкретное транспортное средство будет ехать по-своему (разные реализации, т.к. методы переопределены).
Если создать несколько объектов разных подклассов, то компилятор поступит вполне предсказуемо, и вызовет метод Drive из класса Car для объекта типа Car, и метод Drive из класса Bike для объекта типа Bike.
№8 слайд
![Раннее связывание На что при](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img7.jpg)
Содержание слайда: Раннее связывание
На что при этом ориентируется компилятор? В данном случае, на тип указателя (ссылки), который содержит адрес объектной переменной. Причём тип указателя точно известен на этапе компиляции, а это означает, что связывание вызова метода через этот указатель на объект с кодом реализации метода Drive происходит на этапе построения приложения. Такой процесс называется раннее связывание (static dispatch).
№10 слайд
![Объекты разных типов Однако,](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img9.jpg)
Содержание слайда: Объекты разных типов
Однако, следует учесть, что транспортные средства будут разные, и ехать они должны по-разному... К тому же, заранее неизвестно, сколько всего машин, мотоциклов и телег будет у светофора, т.е. их общее количество определяется динамически, уже на этапе выполнения программы.
№12 слайд
![Решение Для решения этой](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img11.jpg)
Содержание слайда: Решение
Для решения этой проблемы придумали одну очень хитрую вещь: разрешается делать ссылку на объект с типом базового класса, и в дальнейшем присваивать е й адреса объектов производного типа (но не наоборот!)
Transport t = new Car();
// Transport* t = new Car(); // код С++
№13 слайд
![Массив ссылок на объекты](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img12.jpg)
Содержание слайда: Массив ссылок на объекты
Теперь можно будет создать целый массив ссылок типа базового класса, и поочерёдно присвоить им адреса объектов различных производных типов. Таким образом решается проблема хранения разнотипных объектов (однако имеющих общего предка!) в виде массива.
Transport** ar = new Transport*[2];
ar[0] = new Bike();
ar[1] = new Telega();
№15 слайд
![Что-то пошло не так Упс! При](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img14.jpg)
Содержание слайда: Что-то пошло не так…
Упс! При попытке моделирования ситуации на светофоре, программа сработала не совсем так, как хотелось бы. Всему виной – то самое раннее связывание. Ну в самом деле, метод Drive вызывается через указатель traffic[i], а ведь это указатель c типом Transport... Соответственно, компилятор берёт и вызывает метод именно из класса Transport. В итоге, и мотоциклы, и телеги, и машины поедут каким-то общесхематическим образом (таким, как это определено в классе Transport).
№16 слайд
![Позднее связывание Для того,](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img15.jpg)
Содержание слайда: Позднее связывание
Для того, чтобы в С++ сменить механизм с раннего связывания на позднее, достаточно пометить метод Drive в базовом классе Transport как virtual. Метод станет виртуальным, и связывание вызова метода через указатель (ссылку) на объект с кодом реализации метода будет происходить уже на этапе выполнения программы, а не на этапе компиляции.
№17 слайд
![Правило виртуальности](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img16.jpg)
Содержание слайда: Правило виртуальности
Получается, что наличие в коде ключевого слова virtual решило все проблемы по работе с разнотипными объектами! Существует правило виртуальности: метод, объявленный виртуальным в некотором классе, остаётся таким во всех классах-потомках. Но для наглядности в C++ рекомендуется писать ключевое слово virtual и в классах-наследниках, чтобы код оставался читабельным и понятным.
№18 слайд
![Определение Виртуальный м. -](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img17.jpg)
Содержание слайда: Определение
Виртуальный м. - это метод класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет подбираться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит наследнику класса, в котором метод объявлен.
№19 слайд
![Полиморфизм Виртуальные](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img18.jpg)
Содержание слайда: Полиморфизм
Виртуальные методы - это один из важнейших приёмов реализации полиморфизма. Они позволяют создавать общий код, который может работать как с объектами базового класса, так и с объектами любого его класса-наследника. При этом базовый класс определяет наличие способа работы с объектами, а любые его наследники могут предоставлять конкретную реализацию этого способа.
№21 слайд
![Определение Полиморфизм это](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img20.jpg)
Содержание слайда: Определение
Полиморфизм – это принцип, согласно которому есть возможность использовать одну и ту же запись для работы с объектами различных типов данных. Кратко: «один интерфейс, множество реализаций». Полиморфизм позволяет единообразно работать с объектами различных типов, подменяя только сами объекты, но не код по их обработке.
№23 слайд
![Виды полиморфизма В узком](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img22.jpg)
Содержание слайда: Виды полиморфизма
В узком смысле полиморфизм разделяют на статический и динамический. Однако, в большинстве ситуаций под полиморфизмом понимают именно динамический полиморфизм.
Статический полиморфизм – это механизм, при котором одна и та же инструкция может быть использована для работы с объектами разных типов, но конкретный тип и инструкции по работе с ним уже известны на этапе компиляции!
№25 слайд
![Динамический полиморфизм](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img24.jpg)
Содержание слайда: Динамический полиморфизм
Динамический полиморфизм – это механизм, при котором одна и та же инструкция может быть использована для работы с объектами разных типов, но конкретный тип и инструкции по работе с ним НЕ известны на этапе компиляции, а определяются на этапе выполнения (реализуется т.н. полиморфное поведение).
№26 слайд
![Диспетчеризация Для](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img25.jpg)
Содержание слайда: Диспетчеризация
Для реализации динамического полиморфизма используется subtype polymorphism, то есть ДП реализуется только через механизм наследования. Для понимания реализации полиморфного поведения, необходимо как-то выяснить, каким образом выбирается конкретная реализация, которую нужно вызвать для объекта. Для определения конкретного метода при вызове используется механизм связывания (диспетчеризация, dispatch).
№27 слайд
![Ещё раз о раннем связывании](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img26.jpg)
Содержание слайда: Ещё раз о раннем связывании
Присваивание ссылок разных типов данных возможно только тогда, когда слева от оператора присваивания находится ссылка на базовый класс, а справа - адрес объекта одного из производных классов. Через ссылку на базовый класс можно работать с объектом производного класса, но только с той его частью, которая была унаследована из базового. При раннем связывании при работе с объектом производного класса через ссылку на базовый класс связывание вызова метода с самим кодом метода происходит на этапе компиляции программы. То есть вызывается метод класса, соответствующий типу указателя (ссылки), а не типу объекта, который адресуется через данный указатель.
№28 слайд
![Механизм позднего связывания](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img27.jpg)
Содержание слайда: Механизм позднего связывания
При работе через ссылку базового типа с объектом производного класса, часто требуется, чтобы связывание вызова метода с самим кодом метода происходило именно на этапе выполнения программы. То есть, чтобы вызывался метод в соответствии с настоящим типом объекта, а не типом ссылки, которая содержит адрес данного объекта. Для решения данной проблемы в базовом классе (в С++) переопределяемый метод помечается как виртуальный. А в производных классах, этот виртуальный метод просто переопределяется.
№32 слайд
![Загадочные байта По всей](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img31.jpg)
Содержание слайда: Загадочные 4 байта
По всей видимости, пометка хотя бы одного, или пусть даже нескольких методов в классе как virtual, приводит к тому, что размер каждого объекта класса будет увеличен на 4 байта. Откуда они берутся? Вообще, 4 – оптимальное количество байт для хранения адреса какого-нибудь объекта. Запустим отладчик VS 2015.
№34 слайд
![Таблица виртуальных методов](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img33.jpg)
Содержание слайда: Таблица виртуальных методов
Итак, наличие виртуального метода в классе привело к появлению поля под названием __vfptr. Название это расшифровывается как virtual functions pointer, или «указатель на таблицу виртуальных методов». На самом деле, это скорее не таблица, а самый обычный одномерный массив, в котором хранятся адреса всех виртуальных методов класса.
№35 слайд
![Один класс одна таблица Важно](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img34.jpg)
Содержание слайда: Один класс – одна таблица
Важно понять, что на каждый класс, в котором заявлены виртуальные методы, будет по одной таблице ВМ. Так, например, компилятор создаёт одну таблицу для класса Dog, и ещё одну таблицу для класса PugDog. В то время, как у каждого объекта этих классов будет по одному указателю на определённую таблицу ВМ.
№38 слайд
![За всё приходится платить](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img37.jpg)
Содержание слайда: За всё приходится платить
Виртуальный вызов требует выполнения такой операции, как индексированное разыменование. Поэтому вызов виртуальных методов по сути медленнее, чем вызов невиртуальных. Опыты показывают, что примерно 6-13% времени исполнения тратится просто на поиск соответствующего метода.
№39 слайд
![virtual в Java Так как на](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img38.jpg)
Содержание слайда: virtual в Java
Так как на практике чаще всего ожидается вызов метода именно из класса объекта, а не из класса ссылки на объект, то в Java механизм позднего связывания реализован по умолчанию для всех методов, и помечать их как virtual необходимости нет – всё и так работает, как надо. Но «под капотом» всё работает точно также, как и в С++!
№41 слайд
![Запрет переопределения](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img40.jpg)
Содержание слайда: Запрет переопределения
Существует возможность запретить переопределение метода, пометив его как final. Сделано это для того, чтобы гарантированно зафиксировать задуманное поведение метода без возможности его изменения в будущем.
А статические методы вообще не участвуют в процессе переопределения (проверить это, пометив метод как static).
№43 слайд
![Формальное преобразование](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img42.jpg)
Содержание слайда: Формальное преобразование
Механизм наследования классов предусматривает возможности преобразования типов между суперклассом и подклассом. Преобразование типов в каком-то смысле является формальным. Сам объект при таком преобразовании не изменяется, преобразование относится только к типу ссылки на объект.
№47 слайд
![RTTI Оператор instanceof](/documents_6/14085e893ce24d6c5dc0f9f4d6643cd5/img46.jpg)
Содержание слайда: RTTI
Оператор instanceof относится к механизму динамической идентификации типа данных (run-time type information, run-time type identification), который позволяет определить тип данных объекта во время выполнения программы.
https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D1%82%D0%B8%D0%BF%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85
Скачать все slide презентации Polymorphism. Создание проекта одним архивом:
Похожие презентации
-
Создание проекта супермаркета в 3D-редакторе SKETCHUP
-
Создание и редактирование фона. Работа с сенсорами. Создание собственного мини-проекта
-
Создание проекта для графики
-
Создание системы автоматизированного проектирования «Optical constructor»
-
Пример отчёта и порядок действий при создании проекта на VBA
-
Создание проекта. Создание шаблона экранов
-
Пошаговое создание мнемосхемы проекта
-
Проектирование БД и создание программ для обработки данных по темам тестирования студентов
-
Создание многофайловых проектов. Их компиляция и сборка. Работа с заголовочными файлами
-
Творческий проект. Создание программы для облегчения решения квадратных уравнений