сложная, поэтому сделали несколько операторов преобразования static_cast служит для: • Стандартных (неявных) преобразований. • Преобразования числовых типов • Указатель на производный класс в указатель/ссылку на базовый класс • T* в void* • Явное (пользовательское) приведение типа: Person p = static_cast<Person>("Ivan"); (так можно делать, если есть соответствующий конструктор) • Обратные варианты стандартных преобразований: • Указатель/ссылка на базовый класс в указатель/ссылку на производный класс (преобразование вниз/downcast), • void* в любой T*
— это особый тип функции, которая, при её вызове, выполняет «наиболее» дочерний метод, который существует между родительским и дочерними классами. • Если функция отмечена как виртуальная, то все соответствующие переопределения тоже считаются виртуальными. • Сигнатура виртуального метода дочернего класса должна полностью соответствовать сигнатуре виртуального метода родительского класса, иначе это просто другой метод. • Никогда не вызывайте виртуальные функции в теле конструкторов или деструкторов. • Обработка и выполнение вызова виртуального метода занимает больше времени, чем обработка и выполнение вызова обычного метода.
динамический полиморфизм • Таблица ВМ создаётся для каждого полиморфного класса (не объекта) • Объекты полиморфных классов содержат указатель на таблицу виртуальных методов соответствующего класса Поле неявное, стандартными методами не получить его значение. Вызов виртуального метода – это вызов метода по адресу из таблицы. height weigth tailLength Свойства Animal Свойства Cat houseNumber Свойства Home Виртуальный метод Его адрес 0 ~Animal() 0xaba8
Animal Свойства Cat houseNumber Свойства Home Виртуальный метод Его адрес 0 ~Animal() 0xaba8 1 ~getAddress() ТВМ1 Виртуальный метод Его адрес 0 ~getAddress() 0xaba8 ТВМ2
(RAII) Получение ресурса есть инициализация Это программная идиома ООП, которая заключается в том, что с помощью конструктора и деструктора получение некоторого ресурса неразрывно совмещается с инициализацией, а освобождение — с уничтожением объекта. Следует контролировать возможность создания объекта через операцию клонирования и корректно переопределить (или запретить) операцию присваивания для подобных объектов.
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