|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
вопрос по таблице виртуальных методов
Приветствую!
Подскажите, пожалуйста, правильно ли я понимаю, что в следующем коде: Код:
Type TPerson = class(TObject) public constructor Create(); function GetInfo(): WideString; virtual; end; TChild = class(TPerson) public constructor Create(); function GetInfo(): WideString; virtual; end; для класса TChild будет создана виртуальная таблица методов, в которой будут храниться адрес как метод GetInfo() класса TPerson, так и адрес метода GetInfo() класса TChild? При этом, в следующем коде: Код:
var mas: array [0..4] of TPerson; i: Word; begin for i := 0 to 4 do if i mod 2 > 0 then mas[i] := TPerson.Create() else mas[i] := TChild.Create(); for i := 0 to 4 do ShowMessage('i=' + IntToStr(i) + ', ' + mas[i].GetInfo()); при вызове метода mas[i].GetInfo() на основе формального типа TPerson в объявлении массива будет определено смещение в VMT для вызова нужного метода, в результате, во всех четырех случаях будет вызван метод GetInfo() класса TPerson, потому как в VMT замещения его на аналогичный метод класса TChild не осуществлялось (как если бы в наследнике вместо virtual стояла инструкция override). Или я в чем-то ошибаюсь в своих рассуждениях? Спасибо. |