reintroduce does not create a new entry in the virtual table.  In Form3, the
constructor is no overridden, so it is static and does not go into the
virtual table.  The reintroduce keyword only hides the compiler warning.  To
create a new entry, you will need both reintroduce and virtual.

----- Original Message ----- 
From: "Stacey Verner" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, September 28, 2004 1:37 PM
Subject: [DUG] Interesting Constructors


The following example came up recently.

TForm1 = class(TForm)
public
  constructor Create(POwner: TComponent); override;
  class procedure ShowMe;
end;

constructor TForm1.Create(POwner: TComponent)
begin
  ShowMessage('TForm1.Create 1');
  inherited Create(POwner);
  ShowMessage('TForm1.Create 2');
end;

class procedure TForm1.ShowMe
var
    LForm: TForm1;
begin
  LForm1 := Self.Create(nil);
  try
    LForm1.ShowModal;
  finally
    LForm1.Free
  end;
end;

TForm2 = class(TForm)
public
  constructor Create(POwner: TComponent); override;
end;

constructor TForm2.Create(POwner: TComponent)
begin
  ShowMessage('TForm2.Create 1');
  inherited Create(POwner);
  ShowMessage('TForm2.Create 2');
end;

TForm3 = class(TForm)
public
  constructor Create(POwner: TComponent; PWhoCares: Boolean);
reintroduce;
end;

constructor TForm3.Create(POwner: TComponent; PWhoCares: Boolean)
begin
  ShowMessage('TForm3.Create 1');
  inherited Create(POwner);
  ShowMessage('TForm3.Create 2');
end;

TForm4 = class(TForm3)
public
  constructor Create(POwner: TComponent); reintroduce; // Can't be
inherited because create is reintroduced in TForm3.
end;

constructor TForm4.Create(POwner: TComponent)
begin
  ShowMessage('TForm4.Create 1');
  inherited Create(POwner);
  ShowMessage('TForm4.Create 2');
end;

Calling TForm2.ShowMe works perfectly showing all of the correct
messages.

Calling TForm4.ShowMe does not and only shows the messages for TForm1.

The flag reintroduce must create a new heirarchy in the virtual method
table...

Interesting huh.

Stacey Verner             Ph:   +64-9-4154790
Software Developer        Fax:  +64-9-4154791
                          DDI:  +64-9-4154797
CJN Technologies Ltd.     Email: [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>
PO Box 302-278, North Harbour, Auckland 1330, New Zealand
12 Piermark Drive, North Harbour, Auckland, New Zealand
Visit our website at http://www.cjntech.co.nz/
<http://www.cjntech.co.nz/>




----------------------------------------------------------------------------
----


> _______________________________________________
> Delphi mailing list
> [EMAIL PROTECTED]
> http://ns3.123.co.nz/mailman/listinfo/delphi
>
_______________________________________________
Delphi mailing list
[EMAIL PROTECTED]
http://ns3.123.co.nz/mailman/listinfo/delphi

Reply via email to