virtualとoverride

メモ。仮想メソッドと継承、オーバーライドについて。
一つ目。

program methods;

{$APPTYPE CONSOLE}

type
  TBase = class
  public
    procedure Say;
  end;

  TExtend = class(TBase)
  public
    procedure Say;
  end;

procedure TBase.Say;
begin
  WriteLn('Base');
end;

procedure TExtend.Say;
begin
  WriteLn('Extend');
end;

var
  obj: TBase;

begin
  obj := TExtend.Create;
  try
    obj.Say;
  finally
    obj.Free;
  end;
end.

結果は「Base」。
2つ目。

program methods_virtual;

{$APPTYPE CONSOLE}

type
  TBase = class
  public
    procedure Say; virtual;
  end;

  TExtend = class(TBase)
  public
    procedure Say; override;
  end;

procedure TBase.Say;
begin
  WriteLn('Base');
end;

procedure TExtend.Say;
begin
  WriteLn('Extend');
end;

var
  obj: TBase;

begin
  obj := TExtend.Create;
  try
    obj.Say;
  finally
    obj.Free;
  end;
end.

結果は「Extend」