Ответы на экзаменационные вопросы № 1-34 по дисциплине "Программирование" (Средства модульного программирования в системе Турбо-Паскаль. ООП. Объекты в динамической памяти), страница 29

Вернемся к представлению экземпляров объектов, содержащих виртуальные методы. В этом случае в экземпляре объекта размещается дополнительное 16-битовое поле, называемое полем ТВМ, где размещается указатель на соответствующую ТВМ. В этом случае, если объект наследует виртуальные методы и деструкторы, то он наследует и ТВМ. Поле ТВМ заполняется автоматически при вызове конструктора, поэтому вызову виртуальных методов обязательно должен предшествовать вызов конструктора. Схематически экземпляры объектов, имеющих ТВМ, представлены на Рис.3.

Рис. 1. Внутреннее представление экземпляра объекта в случае раннего связывания

Рис.2 Таблицы виртуальных методов объекта-предка и объекта-потомка

При вызове виртуального метода компилятор генерирует код, который выбирает адрес ТВМ из поля ТВМ экземпляра объекта, и затем вызывает соответствующий метод.

Существуют две функции для работы с ТВМ: function Sizeof (obj):word; function Typeof (obj):pointer;

Sizeof в применении к экземпляру объекта вернет записанный в TBiVI действительный размер экземпляра.

Typeof возвращает результат, который является указателем на ТВМ.

Параметром Typeof является либо идентификатором экземпляра, либо объекта.

В Турбо Паскале версии 7.0 существуют уже два вида методов, которые обеспечивают позднее связывание объектов. Это уже известные виртуальные методы и появившиеся в этой версии динамические методы (не путайте динамические объекты и динамические методы, которые могут быть и у динамических, и у статических объектов). Основное различие между виртуальными и динамическими методами состоит в том, что для их реализации компилятор использует внутренние таблицы различной структуры. Таблицы динамических методов требуют меньше памяти, чем таблицы виртуальных методов, однако программа с использованием динамических методов будет работать медленнее. Во всех других отношениях динамические и виртуальные методы считаются эквивалентными. И те, и другие обеспечивают позднее (динамическое) связывание.

Предок

Рис. 3. Внутреннее представление экземпляров объектов, имеющих ТВМ.

33.ООП. Совместимость типов объектов.

В ООП неск. измен прав. совмест. типов по сравн. с обычн. ТП Соамест. эта в общ. случ. бывает 3 видов.

-м/у экземпл. объектов.

-м/у указат. на экземпл. объектов.

-м/у форм. и фактич. парам-ами.

Совместн. по присваив. явл-ся(кроме эквивал. типов, T1=T2) объект. типы, сост. в отнош. наследов., причем присваив. мож. происх. лишь в одном направлении.

<Экземпляр предка>:=<экземпл. потомка>;

Связ. это с тем что поля источн. должны полностью заполнять поля данн. приемника.У потомка полей по крайней мере не меньще, чем у предка, поэтому возмож. именно указ. равиант присваив.Если присваив. происх. наоборот. то часть полей экземпл. потомка мож остаться незаполн. и неопредел., что недопустимо.Трудн. сост в том что потомки, как прав. сод. большее кол-во данных. чем предки.

1.Блок выдел. памяти сод-т указ., а не сами знач.Под указ. всегда выдел одно и тоже кол-во памяти, а сами перем. разиещ. в куче.

2.Блок выдел. памяти сод. только поля данных род-ого объекта. При операции присваив. те поля данных потомка, кот выход. за пределы объекта род. отбрасыв.

Если наприм. перемн. person присваив. staff то из экземпляра staff скопир. лишь общ. для них поля,те name, money, но не bonus. То же прав. действ. для указ. типов объектов.Указат. на потомка мож. присваив. указат. на родит. Форм пар-р(конкр знач либо пар-р перемен.) данного объектного типа может приним.  качестве знач. фактич. парам. объект. своего же типа или дочерние объекты.Пусть есть procedure P(x:Tstaff)Фактич. парам. в этом случ могут быть либо экземпл. типа Tstaff, либо экземпляры потомков типа Tstaff(Tteacher), но не предки Tstaff.

34.ООП. Объекты в динамической памяти. Выделение памяти под объекты и ее

освобождение. Деструктор.

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