Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек_ООП_2_8 - 2_9 Реалізація поліморфізму та Ш...doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
290.82 Кб
Скачать

Модификатор sealed

Этот модификатор позволяет «запечатывать» как отдельные функции, так и классы в целом.

Запечатывание функций применяется для того, чтобы их нельзя было переопределять у наследников, а можно было либо использовать «как есть», либо переобъявлять. Очевидно, что это допустимо только для функций с модификатором override, поскольку обычные функции и так нельзя переобъявлять, а виртуальные функции создаются именно с целью переобъявления.

Запечатывание классов применяется для того, чтобы вообще запретить производство наследников от них. Иногда это приводит к экономии памяти и ускорению выполнения программы. Заметим, что применение структур вместо классов эффективно именно поэтому. Очевидно, что запечатывание абстрактных классов лишено смысла.

Некоторые выводы:

  • Абстрактная функция должна иметь модификатор abstract и не иметь тела.

  • Абстрактная функция является виртуальной, но в отличие от нее она обязательно должна переопределяться у наследников.

  • Переопределяя виртуальный метод А1 у родителя абстрактным методом А2 у сына мы запрещаем использование родительского метода А1 у внука и заставляем его реализовывать этот метод по-своему.

  • Абстрактная функция может быть определена только в абстрактном классе (классе с модификатором abstract).

  • Абстрактные классы могут содержать как абстрактные методы, так и обычные методы доступа.

  • Создавать экземпляры абстрактного класса нельзя, они предназначены для наследования.

  • Неабстрактный класс, являющийся производным от абстрактного, должен содержать фактические реализации всех наследуемых абстрактных функций.

  • Использование статических или виртуальных модификаторов в объявлении абстрактного метода является недопустимым.

Если абстрактный класс наследует интерфейсу, он должен предоставлять реализацию для всех его функций.

Реализация виртуального механизма

Для реализации виртуальных методов, требуется обеспечить выбор нужной функции на этапе выполнения программы. Это называют поздним связыванием (объекта с его методами). Компилятор не может заранее разрешить обращение к виртуальной функции-элементу объекта, если последний представлен указателем или ссылкой. На этапе компиляции действительный тип объекта неизвестен. Поэтому компилятор делает примерно следующее:

  • Для каждого класса, содержащего виртуальные функции, формируется таблица адресов этих функций. Ее называют таблицей виртуальных методов (VMT).

  • Для каждой отдельной иерархии классов адрес конкретной виртуальной функции находится на том же самом месте в таблице виртуальных методов каждого из классов, т. е. имеет одно и то же смещение от начала таблицы.

  • Каждый представитель класса с виртуальными функциями содержит скрытый указатель на его таблицу виртуальных методов. Компилятор автоматически вставляет в начало конструктора класса код, обеспечивающий инициализацию этого указателя адресом виртуальной таблицы класса.

  • При вызове виртуальной функции компилятор генерирует код, который прежде всего извлекает из объекта его указатель на виртуальную таблицу. После этого код обращается к пункту таблицы для данной функции, получая, таким образом, нужный адрес. Затем уже несложно генерировать вызов.