АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Механизм вызова виртуального метода

Читайте также:
  1. II. Документация как элемент метода бухгалтерского учета
  2. Алгебраическое описание метода
  3. Алгоритм метода ветвей и границ
  4. Анализ стандарта по методам статистического контроля и регулирования техпроцессов
  5. Анамнез и его разделы. Приоритет отечественной медицины в разработке анамнестического метода. Понятие о наводящих вопросах: прямых и косвенных.
  6. Анатомия и физиология слуховой трубы. Механизм вентиляции барабанной полости.
  7. Анизотропия. Выявление анизотропии свойств геологических переменных методами геостатистики.
  8. Б) механизмом управления деятельностью государства.
  9. Б. Особенности нервного и гуморального механизмов регуляции функций организма.
  10. Базовая модель экономического равновесия и механизм его восстановления
  11. Блок схемы для каждого метода решения
  12. В 1. Природа и механизм образования горячих трещин при сварке плавлением. Пути повышения сопротивляемости металла образованию горячих трещин.

 

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

Все процедурные переменные с адресами виртуальных методов пронумерованы и хранятся в таблице, называемой таблицей виртуальных методов (VMT — от англ. Virtual Method Table). Такая таблица создается одна для каждого класса объектов, и все объекты этого класса хранят на нее ссылку.

 

Структура объекта в оперативной памяти:

 

 

В таблице виртуальных методов хранятся адреса всех виртуальных методов класса, независимо от того, унаследованы ли они от предка или перекрыты в данном классе.

 

Вызов виртуального метода осуществляется следующим образом:

1) Через объектную переменную выполняется обращение к занятому объектом блоку памяти;

2) Далее из этого блока извлекается адрес таблицы виртуальных методов (он записан в четырех первых байтах);

3) На основании порядкового номера виртуального метода извлекается адрес соответствующей подпрограммы;

4) Вызывается код, находящийся по этому адресу.

 

Покажем, как можно реализовать косвенный вызов виртуального метода ParseLine (он имеет нулевой номер в таблице виртуальных методов) обычными средствами процедурного программирования:

type

TVMT = array[0..9999] of Pointer;

TParseLineFunc = function(Self: TTextReader; constLine: string): Integer;

var

Reader: TTextReader; // объектная переменная

ObjectDataPtr: Pointer; // указатель на занимаемый объектом блок памяти

VMTPtr: ^TVMT; // указатель на таблицу виртуальных методов

MethodPtr: Pointer; // указатель на метод

begin

...

ObjectDataPtr:= Pointer(Reader); // обращение к данным объекта

VMTPtr:= Pointer(ObjectDataPtr^); // извлечение адреса VMT

MethodPtr:= VMTPtr^[0]; // извлечение адреса метода из VMT

TParseLineFunc(MethodPtr)(Reader, S); // вызов метода

...

end.

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)