Just found that the below works.
Note, that the result type of "a" (overridden) is different. Well, TFoo2 will always satisfy the needs of TFoo, so it seems save. I still found it surprising. Is it intended?
program Project1;
type
TFoo= class
public
function a: TFoo; virtual;
end;
TFoo2= class(TFoo)
public
function a: TFoo2; override;
end;
function TFoo2.a: TFoo2;
begin
end;
function TFoo.a: TFoo;
begin
end;
begin
end.