type t1 = class i: integer; procedure p1(x: T); virtual := exit; function f: T; virtual := default(T); end; t2 = class(t1) procedure p1(x: TT); override; begin i := 1; end; function f: T1; override; begin Result := default(T1); i := 2; end; end; begin var o: t1 := new t2; o.p1&(2); assert(o.i = 1); assert(o.f& = 0); assert(o.i = 2); end.