Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delphi: Method 'Create' hides virtual method of base - but it's right there

Tags:

Consider the hypothetical object hierarchy, starting with:

TFruit = class(TObject) public     constructor Create(Color: TColor); virtual; end; 

and its descendant:

TApple = class(TFruit) public     constructor Create(); overload; virtual;     constructor Create(Color: TColor); overload; override; //deprecated. Calls other constructor - maintaining the virtual constructor chain end; 

The idea here is that I've overridden the virtual constructor of the base class, with an overload that also happens to be virtual.

Delphi complains:

Method 'Create' hides virtual method of base type 'TFruit'

Except it doesn't hide it - it's right there!

  • I overrode the virtual method in the ancestor, and
  • I overloaded it with another version

What's the deal?

like image 240
Ian Boyd Avatar asked Feb 01 '12 20:02

Ian Boyd


1 Answers

Two solutions:

type   TFruit = class(TObject)   public     constructor Create(Color: TColor); virtual;   end;    TApple = class(TFruit)   public     constructor Create(); reintroduce; overload;     constructor Create(Color: TColor); overload; override;   end; 

Or:

type   TFruit = class(TObject)   public     constructor Create; overload; virtual; abstract;     constructor Create(Color: TColor); overload; virtual;   end;    TApple = class(TFruit)   public     constructor Create(); override;     constructor Create(Color: TColor); override;    end; 
like image 177
NGLN Avatar answered Sep 29 '22 14:09

NGLN