{$mode objfpc}{$H+}{$J-} uses Classes; type TMyMethod = function (const A, B: Integer): Integer of object; TMyClass = class(TComponent) class function Add(const A, B: Integer): Integer; virtual; class procedure AddHelper; virtual; end; TMyClass2 = class(TMyClass) class function Add(const A, B: Integer): Integer; override; class procedure AddHelper; override; end; class function TMyClass.Add(const A, B: Integer): Integer; begin Writeln('Doing TMyClass.Add'); Result := A + B; AddHelper; end; class procedure TMyClass.AddHelper; begin Writeln('Doing TMyClass.AddHelper'); Writeln(Self.ClassName); end; class function TMyClass2.Add(const A, B: Integer): Integer; begin Writeln('Doing TMyClass2.Add'); Result := A + B; AddHelper; end; class procedure TMyClass2.AddHelper; begin Writeln('Doing TMyClass2.AddHelper'); Writeln(Self.ClassName); end; var M: TMyMethod; begin M := @TMyClass.Add; Writeln(M(10, 20)); M := @TMyClass2.Add; Writeln(M(10, 20)); end.