program ideone;

{$mode objfpc}{$H+}

type
 Parent = class
	  class function check: boolean; virtual; abstract;
	  procedure foo;
	end;

 Child1 = class(Parent)
	  class function check: boolean; override;
	end;

 Child2 = class(Parent)
	  class function check: boolean; override;
	end;

procedure Parent.foo;
begin
  check;
end;

 class function Child1.check: boolean;
 begin
   writeln('Child1.check');
   Result := True;
 end;

class function Child2.check: boolean;
begin
  writeln('Child2.check');
  Result := True;
end;

var
  aclass: class of Parent;
begin
	Child1.Create.foo;
	Child2.Create.foo;
  if random < 0.5 then aclass := Child1 else aclass := Child2;
  aclass.check;
end.