$30 off During Our Annual Pro Sale. View Details »

Программирование – 1 курс весна 2022 – 7 занятие

Программирование – 1 курс весна 2022 – 7 занятие

ТиМПИ

April 05, 2022
Tweet

More Decks by ТиМПИ

Other Decks in Programming

Transcript

  1. 05 апреля 2022 aak@dscs.pro Анастасия Андреевна Корепанова Введение в ООП

    (часть 4)
  2. 2/28 2/28 Оператор преобразования в стиле C Довольно простая система

    типов: • Числовые типы • Указатели • Структуры • Классов нет
  3. 3/28 3/28 Преобразования в стиле C++: static_cast Система типов более

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

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

    ссылок на несвязанные типы Зачем? Работаем на низком уровне, важно представление данных
  6. 6/28 6/28 Сравним преобразования в С и С++ Преобразование в

    стиле C может заменить любое из рассмотренных ранее преобразований, но менее безопасно!
  7. 7/28 7/28 Расположение объекта в памяти 1/3 height weigth tailLength

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

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

    Свойства Animal height weigth Свойства Animal
  10. 10/28 10/28 Организация памяти при множественном наследовании 1/5 Как располагается

    в памяти?
  11. 11/28 11/28 Организация памяти при множественном наследовании 2/5 height weigth

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

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

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

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

  16. 16/28 16/28 Ромбовидное наследование 2/2 Animal Home Life Life Dog

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

    указателя В памяти: Life Animal Home Life Идейно: Dog
  18. 18/28 18/28 Размер объектов 1/2

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

  20. 20/28 20/28 Вспомним виртуальные методы Виртуальный метод в языке С++

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

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

  23. 23/28 23/28 Таблица виртуальных методов 3/3 height weigth tailLength Свойства

    Animal Свойства Cat houseNumber Свойства Home Виртуальный метод Его адрес 0 ~Animal() 0xaba8 1 ~getAddress() ТВМ1 Виртуальный метод Его адрес 0 ~getAddress() 0xaba8 ТВМ2
  24. 24/28 24/28 Рекомендации Основные ошибки при использовании ООП: унаследовать всё

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

    «Если есть функция, работающая с базовым классом, то она должна иметь возможность работать с производным классом, не зная об этом»
  26. 26/28 26/28 Resource Acquisition Is Initialization Resource Acquisition Is Initialization

    (RAII) Получение ресурса есть инициализация Это программная идиома ООП, которая заключается в том, что с помощью конструктора и деструктора получение некоторого ресурса неразрывно совмещается с инициализацией, а освобождение — с уничтожением объекта. Следует контролировать возможность создания объекта через операцию клонирования и корректно переопределить (или запретить) операцию присваивания для подобных объектов.
  27. 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
  28. 05 апреля 2022 aak@dscs.pro Анастасия Андреевна Корепанова Введение в ООП

    (часть 4)