Как устроен объект изнутри
Рассмотрим, как устроен объект изнутри и как происходит вызов методов в этом примере. Ясно, что каждый экземпляр класса (объект) содержит отдельную копию всех его полей. Ясно также, что внутри экземпляра есть указатели на таблицы VMT и DMT.
Нарисуем структуру объектов Object1 и Object2:
Object1
У казатель на объект Object1 |
|
Указатель на класс TFirstClass |
Поле FMyField1 |
Поле FMyField2 |
Число динамических методов (2)
|
Индекс метода TFirstClass.DynaMetod1 (-1) |
Индекс метода TFirstClass.DynaMetod2 (-2) |
Адрес метода TFirstClass.DynaMetod1 |
Адрес метода TFirstClass.DynaMetod2 |
И нформация класса TFirstClass |
Адрес метода TFirstClass.VirtMethod1 |
Адрес метода TFirstClass.VirtMethod2 |
Object2
У казатель на объект Object2 |
|
Указатель на класс TSecondClass |
Поле FMyField1 |
Поле FMyField2 |
Информация класса T SecondClass |
Адрес метода TSecondClass.VirtMethod1 |
Адрес метода TSecondClass.VirtMethod2 |
Число динамических методов (1) |
Индекс метода TSecondClass.DynaMetod1 (-1) |
Адрес метода TSecondClass.DynaMetod1
|
Объект как экземпляр класса содержит указатель на его класс. Класс как структура состоит из двух частей. Начиная с адреса, на который ссылается указатель на класс, располагается таблица VMT. Она содержит адреса всех виртуальных методов класса, включая унаследованные от предков.
Отметим, что в объектах Object1 и Object2 длина таблиц VMT одинакова, в них по два элемента. Перед каждой VMT располагается специальная структура – информация класса. Одно из полей информации класса содержит адрес таблицы DMT класса. Таблица DMT имеет следующий формат: в начале – количество элементов таблицы, затем – индексы методов, нумерация которых начинается с (-1) и идет по убывающей. После индексов идут адреса динамических методов. Обратим внимание, что DMT объекта Object1 состоит из двух элементов, а объекта Object2 – из одного метода, соответствующего перекрытому методу DynaMetod1 в данном классе.
Внимание! В случае вызова Object2.DynaMetod2 индекс и адрес его не будут найдены в DMT Object2, тогда произойдет обращение к таблице DMT объекта Object1, в которой содержится адрес нужного метода DynaMetod2. В случае вызова Object2.VirtMetod2 адрес его сразу будет найден в таблице VMT объекта Object2.
Это демонстрирует экономию памяти при использовании динамических методов и экономию времени вызова для виртуальных методов.
Итоги:
Полиморфизм – это возможность описания одинакового по имени действия, применяемого ко всем объектам иерархии наследования, то есть возможность иметь несколько методов с одним и тем же именем для различных объектов одной иерархии. Это средство дает возможность развития объектов в потомках. Оно реализуется тем, что объект-потомок может добавлять и переопределять методы, то есть заменять методы предка на новые с теми же именами. Какой из методов будет выполняться при обращении к методу с заданным именем, определяется типом объекта (предок или потомок) и видом используемого метода (статический, виртуальный или динамический).
Полиморфизм – это свойство родственных классов решать схожие по смыслу проблемы разными способами.
В ООП действуют следующие правила описания и наследования методов:
Служебные слова virtual и dynamic вводят (описывают) новый виртуальный или динамический метод;
Для перекрытия наследуемого статического метода никаких дополнительных служебных слов не используется. Но если в порожденном классе надо перекрыть наследуемый виртуальный или динамический метод используется служебное слово override;
В одноименных статических методах порожденных классов списки параметров могут отличаться. Списки параметров виртуальных и динамических методов порождающих и порожденных классов должны быть идентичными.
- Объектно-ориентированный анализ
- Объектно-ориентированное программирование.
- Объектно-ориентированное проектирование.
- Основные понятия объектно-ориентированного проектирования.
- Классы и объекты в Object Pascal.
- Важнейшие принципы объектно-ориентированного программирования.
- Составляющие класса.
- Объекты
- Создание и уничтожение объектов.
- Наследование конструкторов и деструкторов.
- Свойства и инкапсуляция.
- Статические методы.
- Полиморфизм. Виртуальные и динамические методы.
- Абстрактные методы.
- Перекрытие виртуальных и динамических методов.
- Как устроен объект изнутри
- Перезагрузка методов.
- Задача с использованием полиморфизма
- Области видимости.
- Создание класса комплексных чисел.
- Создание класса векторов
- Объект-список
- Модуль по работе со списками
- Основная программа по работе с объектами-списками
- Система программирования Delphi
- Терминология Delphi.
- Первые шаги визуального программирования в среде Delphi.
- Иерархия компонентов.
- Собственники компонентов
- Элементы управления.
- Компоненты (tComponent)
- Оконные не оконные
- Родительские и дочерние компоненты.
- Объектно-событийное программирование. События
- Реакции на события
- Программирование реакции на событие
- Особенности реализации событий
- Делегирование событий
- Виды событий
- Диалоги. Работа с файлами. Открытие и закрытие файлов с использованием стандартных диалоговых окон.
- TOpenDialog и tSaveDialog – диалоги открытия и сохранения файлов (страница dialogs )
- Компонент класса tform
- Создание и использование форм
- Шаблоны форм
- Программы со многими формами
- Модульный принцип построения программ.
- Программные файлы. Основные типы файлов проекта. Простейшее приложение.
- Структура головного файла проекта.