[fpc-pascal] Wrong constructor returning the right object

Mark Morgan Lloyd markMLl.fpc-pascal at telemetry.co.uk
Sun Feb 23 15:26:16 CET 2014


I think I've sorted this but I'd appreciate being kicked if it looks 
like I'm doing something badly wrong.

What determines the constructor that's called when an object's created?

I've got a couple of classes defined like this:

   TB5500BaseUnit=
     class(TObject)
       constructor Create(enum: integer; mnem: String7; unitIndex: 
integer; unitDesignate: integer; cc: TObject);
..

   TB5500SPOUnit=
     class (TB5500BaseUnit)
       constructor Create(enum: integer; mnem: String7; unitIndex: 
integer; unitDesignate: integer; cc: TObject);
..

The actual objects being created are in response to configuration tables 
and files:

var
   unitClass: class of TB5500BaseUnit; (* Ancestor of all I/O devices *)
   u: TB5500BaseUnit;
   name: string;                       (* For debugging *)
..

         unitClass := LookupUnitType( { from device name } );
         name := unitClass.ClassName;    (* For debugging *)
         name := '';                     (* Make sure it's wiped *)
         u := unitClass.Create(Ord(mnem), specs.unitName, 
specs.unitIndex, specs.designate, self);
         name := u.ClassName;            (* For debugging *)
         thisUnit[specs.unitIndex] := u;

If I was trying to create a TB5500SPOUnit I was finding that unitclass 
was set correctly, and that u was getting a valid type with (later) 
public methods declared as overrides being available. The odd thing was 
that TB5500SPOUnit.Create() was not being called, but instead 
TB5500BaseUnit.Create().

I find that if I explicitly decorate TB5500BaseUnit.Create() as virtual 
and TB5500SPOUnit.Create() as override then TB5500SPOUnit.Create() is 
called correctly. I didn't think this was necessary, but on reflection I 
assume that it's because u is declared as a TB5500BaseUnit: the 
variable's compile-time rather than run-time class is being used for the 
constructor unless explicitly overridden.

Is there an obvious way of tiying this up that I'm overlooking?

-- 
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]



More information about the fpc-pascal mailing list