Показать сообщение отдельно
  #1  
Старый 28.02.2009, 00:40
demoston demoston вне форума
Прохожий
 
Регистрация: 28.02.2009
Сообщения: 1
Репутация: 10
По умолчанию вопрос по таблице виртуальных методов

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

Спасибо.
Ответить с цитированием