When overriding a function that has a class typed result, it is possible to change the exact class to
a descendant of the result type of the parent method.
This means that the following will compile:
Program Project1;
{$mode objfpc}
type
TClass1 = class
public
function A: TClass1; virtual; abstract;
end;
TClass2 = class(TClass1)
public
function A: TClass2; override; // result differs: TClass2 as descendant of TClass1
end;
{ TClass2 }
function TClass2.A: TClass2;
begin
Result := Self;
end;
begin
end.
The covariant return type can be used in ObjFPC and Delphi modes.