Вы забыли объявить переопределенные методы как, ну, переопределенные:
TMySample = class(TSample)
public
procedure Hello; override; // <--
end;
TYourSample = class(TSample)
public
procedure Hello; override; // <--
end;
На самом деле, компилятор предупреждал вас об этом, но вы не слушали:)
[dcc32 Warning] Unit1.pas(25): W1010 Method 'Hello' hides virtual method of base type 'TSample'
[dcc32 Warning] Unit1.pas(30): W1010 Method 'Hello' hides virtual method of base type 'TSample'
Кроме того, вы, вероятно, уже знаете это, но есть две проблемы с вашим примером кода:
- Поскольку локальные переменные неуправляемых типов не инициализируются, значение
a
равно undefined. - Вы не защищаете объект
TSample
, поэтому можете утечь ресурсы. (На самом деле, в этом случае вы будете из-за исключения!)
Исправлено:
a := 123;
if a = 1 then
T := TMySample.Create
else
T := TYourSample.Create;
try
T.Hello; //Abstract Error here
finally
T.Free;
end;