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.