var i: integer; type t0base=abstract class procedure p1; abstract; procedure p2(a: U); abstract; end; t0base2=abstract class procedure p1(a:T); abstract; end; t0 = class(t0base) procedure p1; override := exit; procedure p2(a: U); override := exit; end; t1=class(t0) end; t2 = class(t0base2) procedure p1(a: T); override; begin assert(a = default(T)); i := 3; end; end; t3=class(t2) end; begin var o := new t0; var o2 := new t1; var o3 := new t3; var o4 := new t2; o3.p1(0); assert(i = 3); i := 0; o4.p1(0); assert(i = 3); end.