Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
RTTI и размещение объектов в памяти
В Object Pascal после компиляции программы для любого класса сохраняется некая дополнительная информация, которая размещается в памяти непосредственно перед VMT. Эта информация называется информацией о типе периода времени выполнения (run-time type information, RTTI). Как было сказано выше, любой объект кроме данных полей содержит указатель на VMT (возможно на пустую таблицу, если у класса и его предков нет виртуальных методов). Следовательно, во время работы программы любой объект может получить доступ к RTTI своего класса. Схема размещения объектов и класса в памяти показана на рис. 1. Рис. 1. Схема размещения объектов и RTTI в памяти Известно, что в RTTI в числе прочих содержатся следующие данные: 1. Указатель на VMT класса-предка; 2. Указатель на строку с именем класса; 3. Размер экземпляра объекта в байтах. Эти данные позволяют во время выполнения программы контролировать (type checking) и приводить (type casting) объектные типы. Для контроля типов используется оператор is. Выражение объект is класс возвращает true, если объект принадлежит указанному классу или потомкам этого класса: if Man is TPerson then... Для приведения типов используется оператор as в следующей форме: (Man as TPerson).SetAge(10); Допустима традиционная конструкция приведения типов в виде TPerson(Man).SetAge(10), однако оператор as является более безопасным. В случае неудачи (то есть, когда объект не относится к указанному классу или его потомкам) он генерирует обрабатываемую исключительную ситуацию, а жёсткое приведение типов может привести к краху приложения.
|