{$MODE DELPHI} type TExecProc = procedure of object; TA = class public procedure P1; overload; virtual; procedure P1(const param: boolean); overload; virtual; end; TB = class(TA) public procedure P1(const param: boolean); override; end; procedure ShowProc(p: TExecProc); begin p; end; procedure TA.P1; begin writeln('1'); end; procedure TA.P1(const param: boolean); begin writeln('2'); halt(1); end; procedure TB.P1(const param: boolean); begin writeln('3'); halt(2); end; var a: TA; b: TB; begin a := TA.Create; b := TB.Create; ShowProc(a.P1); // compile and execute correctly ShowProc(b.P1); // error on compile !!! but here should be call TA.P1 !!! end.