Delphi: Overridden virtual constructor descendant not being called by overload -
yet in series of questions regarding constructors in delphi.
i have base class has has virtual constructor:
tcomputer = class(tobject) public constructor create(teapot: integer); virtual; end;
the constructor virtual times needs call
var computerclass: class of tcomputer; computer: tcomputer; begin computer := computerclass.create(nteapot);
the constructor overridden
in descendants:
tcellphone = class(tcomputer) public constructor create(teapot: integer); override; end; tiphone = class(tcellphone ) public constructor create(teapot: integer); override; end;
where tcellphone
, tiphone
descendants each have opportunity own initialization (of members not included readability).
but add overloaded constructor ancestor:
tcellphone = class(tcomputer) public constructor create(teapot: integer); override; overload; constructor create(teapot: integer; handle: string); overload; end;
the alternate constructor in tcellphone calls other virtual constructor, gets proper overridden behaviour:
constructor tcellphone.create(teapot: integer; handle: string); begin tcellphone.create(teapot); //call sibling virtual constructor fhandle := handle; end;
the problem descendant, overridden, constructor never called. actual stack trace chain of calls is:
phone := tiphone.create(37, 'spout') constructor tcellphone.create(teapot: integer; handle: string) constructor tcellphone.create(teapot: integer) constructor tcomputer.create(teapot: integer) tobject.create
the sibling call tcellphone.create(int)
, virtual, should have called descendant, overridden, method in tiphone
:
phone := tiphone.create(37, 'spout') constructor tcellphone.create(teapot: integer; handle: string) constructor tiphone.create(teapot: integer) constructor tcellphone.create(teapot: integer) constructor tcomputer.create(teapot: integer) tobject.create
so seems attempts use sibling virtual constructor delphi not work expected.
is bad idea 1 constructor use another? design intention code in overloaded constructors copy-paste versions of each other?
i notice in .net constructors chain each other:
public bitmap(int width, int height) : this(width, height, pixelformat.format32bppargb) {} public bitmap(int width, int height, pixelformat format) {...}
this seems problem if:
- a constructor virtual
- you overload constructors
is rule cannot have 1 constructor overload another?
errr..
constructor tcellphone.create(teapot: integer; handle: string); begin tcellphone.create(teapot); //call sibling virtual constructor fhandle := handle; end;
that should be:
constructor tcellphone.create(teapot: integer; handle: string); begin create(teapot); //call sibling virtual constructor fhandle := handle; end;
you creating new tcellphone instance , not calling other create method.
Comments
Post a Comment