Приветствую!
Подскажите, пожалуйста, правильно ли я понимаю, что в следующем коде:
Код:
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). Или я в чем-то ошибаюсь в своих рассуждениях?
Спасибо.