logo
Лекции програм_new_последняя версия1

Как устроен объект изнутри

Рассмотрим, как устроен объект изнутри и как происходит вызов методов в этом примере. Ясно, что каждый экземпляр класса (объект) содержит отдельную копию всех его полей. Ясно также, что внутри экземпляра есть указатели на таблицы 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.

Это демонстрирует экономию памяти при использовании динамических методов и экономию времени вызова для виртуальных методов.

Итоги:

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

Полиморфизм – это свойство родственных классов решать схожие по смыслу проблемы разными способами.

В ООП действуют следующие правила описания и наследования методов:

  1. Служебные слова virtual и dynamic вводят (описывают) новый виртуальный или динамический метод;

  2. Для перекрытия наследуемого статического метода никаких дополнительных служебных слов не используется. Но если в порожденном классе надо перекрыть наследуемый виртуальный или динамический метод используется служебное слово override;

  3. В одноименных статических методах порожденных классов списки параметров могут отличаться. Списки параметров виртуальных и динамических методов порождающих и порожденных классов должны быть идентичными.