История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Топ:
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Интересное:
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Уполаживание и террасирование склонов: Если глубина оврага более 5 м необходимо устройство берм. Варианты использования оврагов для градостроительных целей...
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Дисциплины:
2017-06-05 | 376 |
5.00
из
|
Заказать работу |
|
|
В C++ введено понятие виртуальных функций (методов). Механизм виртуальных методов заключается в том, что результат вызова виртуального метода с использованием указателя или ссылки зависит от типа объекта, на который указывает этот указатель [5-9].
Тип данных (класс), содержащий хотя бы одну виртуальную функцию, называется полиморфным типом (классом), а объект этого типа – полиморфным объектом.
Таким образом, при вызове виртуальной функции через указатель на полиморфный объект осуществляется динамический выбор тела функции в зависимости от текущего тела объекта, а не от типа указателя. Тело функции в таком случае выбирается на этапе выполнения, а не компиляции. В этом и проявляется динамический полиморфизм.
В языке C++ виртуальные методы классов существуют наряду с невиртуальными методами. В некоторых объектно-ориентированных языках программирования, например, в языке Java, все методы в иерархиях классов являются виртуальными.
Виртуальная функция объявляется описателем virtual. Во всех производных классах наследуемая виртуальная функция остается таковой (виртуальной). Таким образом, все типы-наследники полиморфного типа являются полиморфными типами.
Виртуальные деструкторы
Виртуальный деструктор – важная часть аппарата динамического полиморфизма. Если указатель типа базового класса указывает на объект производного класса, то при удалении объекта с использованием данного указателя в случае невиртуальности деструкторов сработает деструктор того типа, который был использован при объявлении указателя. При описании конструкторов и деструкторов уже было указано [5,8-9], что при удалении объекта во вторую очередь срабатывает деструктор базового типа, удаляя информационные члены базового типа, унаследованные в типе-наследнике, а сначала срабатывает деструктор текущего объекта, удаляя дополнительные члены типа-наследника. Таким образом, деструктор базового типа применяется к объектам производного типа. Но при его локальном срабатывании не будут удалены дополнительные члены типа-наследника.
|
Таким образом, при создании и удалении объектов производных типов с использованием указателей необходимо описывать деструкторы как виртуальные, если типы-наследники в своем составе имеют динамические структуры. Однако отметим следующее:
1) виртуальный деструктор необходим и для объекта без динамических структур в случае наличия динамических структур у типа-наследника, так как деструктор, автоматически генерируемый системой по умолчанию, является невиртуальным;
2) несмотря на то, что имя деструктора производного класса отличается от имени деструктора базового класса, достаточно объявления деструктора виртуальным только в базовом классе;
3) конструктор, в отличие от деструктора, нельзя описывать как виртуальный, так как всегда срабатывает конструктор именно того типа, который используется при создании объекта, и только после создания объекта его адрес передается для присвоения указателю.
Абстрактные классы. Чистые виртуальные функции
Чистая виртуальная функция – функция вида:
virtual тип_возвращаемого_значения имя_функции (формальные параметры) = 0;
Такая форма записи функции означает, что данная функция (точнее – метод класса) не имеет тела, описывающего ее алгоритм.
Абстрактный класс – это класс, содержащий хотя бы одну чистую виртуальную функцию.
Нельзя создавать объекты на основе абстрактных классов, так как последние, имея в своем составе чистые виртуальные функции, не являются полноценными типами данных. Однако указатели на абстрактные классы создавать можно [5,8-9].
Несмотря на то что абстрактный класс не является полноценным типом, таблица виртуальных методов (ТВМ) для него создается. При этом в ТВМ перечисляются все виртуальные функции, в том числе и чистые виртуальные функции.
|
В классе-наследнике чистая виртуальная функция может быть переопределена обычной виртуальной функцией с соответствующей заменой пустого значения на адрес данной функции в ТВМ класса-наследника.
Класс-наследник абстрактного класса может также быть абстрактным классом, если в нем осталась (или была дополнительно введена) хотя бы одна чистая виртуальная функция.
|
|
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!