Slide 1

Slide 1 text

05 апреля 2022 [email protected] Анастасия Андреевна Корепанова Введение в ООП (часть 4)

Slide 2

Slide 2 text

2/28 2/28 Оператор преобразования в стиле C Довольно простая система типов: • Числовые типы • Указатели • Структуры • Классов нет

Slide 3

Slide 3 text

3/28 3/28 Преобразования в стиле C++: static_cast Система типов более сложная, поэтому сделали несколько операторов преобразования static_cast служит для: • Стандартных (неявных) преобразований. • Преобразования числовых типов • Указатель на производный класс в указатель/ссылку на базовый класс • T* в void* • Явное (пользовательское) приведение типа: Person p = static_cast("Ivan"); (так можно делать, если есть соответствующий конструктор) • Обратные варианты стандартных преобразований: • Указатель/ссылка на базовый класс в указатель/ссылку на производный класс (преобразование вниз/downcast), • void* в любой T*

Slide 4

Slide 4 text

4/28 4/28 Преобразования в стиле C++: cost_cast Служит для снятия/добавления константности Добавление константности используется редко, так как это неявное преобразование. Обычно это плохо, но бывают исключения

Slide 5

Slide 5 text

5/28 5/28 Преобразования в стиле C++: reinterpret_cast Преобразовывать указателей и ссылок на несвязанные типы Зачем? Работаем на низком уровне, важно представление данных

Slide 6

Slide 6 text

6/28 6/28 Сравним преобразования в С и С++ Преобразование в стиле C может заменить любое из рассмотренных ранее преобразований, но менее безопасно!

Slide 7

Slide 7 text

7/28 7/28 Расположение объекта в памяти 1/3 height weigth tailLength Объект базового класса Animal Поля самого объекта Cat

Slide 8

Slide 8 text

8/28 8/28 Расположение объекта в памяти 2/3 height weigth tailLength Свойства Animal Свойства Cat height weigth tailLength Свойства Animal Свойства Cat

Slide 9

Slide 9 text

9/28 9/28 Расположение объекта в памяти 3/3 height weigth ??? Свойства Animal height weigth Свойства Animal

Slide 10

Slide 10 text

10/28 10/28 Организация памяти при множественном наследовании 1/5 Как располагается в памяти?

Slide 11

Slide 11 text

11/28 11/28 Организация памяти при множественном наследовании 2/5 height weigth tailLength Свойства Animal Свойства Cat houseNumber Свойства Home

Slide 12

Slide 12 text

12/28 12/28 Организация памяти при множественном наследовании 3/5 height weigth tailLength Свойства Animal Свойства Cat houseNumber Свойства Home height weigth tailLength Свойства Animal Свойства Cat houseNumber Свойства Home

Slide 13

Slide 13 text

13/28 13/28 Организация памяти при множественном наследовании 4/5 cat ? animal cat ? hm hm ? animal

Slide 14

Slide 14 text

14/28 14/28 Организация памяти при множественном наследовании 5/5

Slide 15

Slide 15 text

15/28 15/28 Ромбовидное наследование 1/2 В чём проблема?

Slide 16

Slide 16 text

16/28 16/28 Ромбовидное наследование 2/2 Animal Home Life Life Dog Animal Home Life Life Идейно: В памяти: Dog

Slide 17

Slide 17 text

17/28 17/28 Виртуальное наследование Dog Animal Home смещение указателя смещение указателя В памяти: Life Animal Home Life Идейно: Dog

Slide 18

Slide 18 text

18/28 18/28 Размер объектов 1/2

Slide 19

Slide 19 text

19/28 19/28 Размер объектов 2/2 Вспомним, что такое виртуальный метод

Slide 20

Slide 20 text

20/28 20/28 Вспомним виртуальные методы Виртуальный метод в языке С++ — это особый тип функции, которая, при её вызове, выполняет «наиболее» дочерний метод, который существует между родительским и дочерними классами. • Если функция отмечена как виртуальная, то все соответствующие переопределения тоже считаются виртуальными. • Сигнатура виртуального метода дочернего класса должна полностью соответствовать сигнатуре виртуального метода родительского класса, иначе это просто другой метод. • Никогда не вызывайте виртуальные функции в теле конструкторов или деструкторов. • Обработка и выполнение вызова виртуального метода занимает больше времени, чем обработка и выполнение вызова обычного метода.

Slide 21

Slide 21 text

21/28 21/28 Таблица виртуальных методов 1/3 • Через неё реализуется динамический полиморфизм • Таблица ВМ создаётся для каждого полиморфного класса (не объекта) • Объекты полиморфных классов содержат указатель на таблицу виртуальных методов соответствующего класса Поле неявное, стандартными методами не получить его значение. Вызов виртуального метода – это вызов метода по адресу из таблицы. height weigth tailLength Свойства Animal Свойства Cat houseNumber Свойства Home Виртуальный метод Его адрес 0 ~Animal() 0xaba8

Slide 22

Slide 22 text

22/28 22/28 Таблица виртуальных методов 2/3

Slide 23

Slide 23 text

23/28 23/28 Таблица виртуальных методов 3/3 height weigth tailLength Свойства Animal Свойства Cat houseNumber Свойства Home Виртуальный метод Его адрес 0 ~Animal() 0xaba8 1 ~getAddress() ТВМ1 Виртуальный метод Его адрес 0 ~getAddress() 0xaba8 ТВМ2

Slide 24

Slide 24 text

24/28 24/28 Рекомендации Основные ошибки при использовании ООП: унаследовать всё от всего Ещё примеры: 1. Отнаследовать класс Circle on Point. 2. Класс LinearSystem от Matrix. Круг Прямоугольник Форма Треуго льник

Slide 25

Slide 25 text

25/28 25/28 Принцип подстановки Барбары Лисков Принцип подстановки Барбары Лисков: «Если есть функция, работающая с базовым классом, то она должна иметь возможность работать с производным классом, не зная об этом»

Slide 26

Slide 26 text

26/28 26/28 Resource Acquisition Is Initialization Resource Acquisition Is Initialization (RAII) Получение ресурса есть инициализация Это программная идиома ООП, которая заключается в том, что с помощью конструктора и деструктора получение некоторого ресурса неразрывно совмещается с инициализацией, а освобождение — с уничтожением объекта. Следует контролировать возможность создания объекта через операцию клонирования и корректно переопределить (или запретить) операцию присваивания для подобных объектов.

Slide 27

Slide 27 text

27/28 27/28 Источники Основные источники: • Курсы "Программирование на языке C++", "Программирование на языке C++ (продолжение)". Лектор А.В. Смаль. https://stepik.org/course/7/info, https://stepik.org/course/3206/info • Курс "Программирование на C++, часть 1 (осень 2018)". Лектор В.М. Лесин. https://www.youtube.com/playlist?list=PLlb7e2G7aSpTFea2FYxp7m FfbZW-xavhL

Slide 28

Slide 28 text

05 апреля 2022 [email protected] Анастасия Андреевна Корепанова Введение в ООП (часть 4)