Surcharge - Constructeurs [Résolu]

Signaler
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011
-
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011
-
Bonjour à tous.
Comme le temps de ce mois de juillet incite à méditer sur Delphi plutôt qu'à marcher sous la pluie, une petite question qui m'a toujours intrigué :
Lorsqu'on est amené à surcharger une méthode, on sait qu'il est nécessaire qu'elle ait été déclarée auparavant Virtual dans l'ancêtre.
Comment se fait-il que lorsqu'on fait "constructor Create ... override; ", on n'a pas besoin de cette précaution ?. Est-ce du au fait que dans le lointain TObject, le constructor était déjà virtual ?.. (si oui, où peut-on voir le source ?)
Quelqu'un peut-il m'éclairer ?
Bon été à tous.
JJT

5 réponses

Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Salut,

"Lorsqu'on est amené à surcharger une méthode, on sait qu'il est nécessaire qu'elle ait été déclarée auparavant Virtual dans l'ancêtre. "
- Ou en Dynamic!

"Est-ce du au fait que dans le lointain TObject, le constructor était déjà virtual ?.. (si oui, où peut-on voir le source ?) "
- Oui

Unité classes.pas:
-----------------------
TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
private
public
constructor Create(AOwner: TComponent); virtual;
destructor Destroy; override;
procedure BeforeDestruction; override;

A+

Composants Cindy pour Delphi
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Bonnes vacances et n' oublie pas de valider la réponse! ^^
A+


Composants Cindy pour Delphi
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
Bonjour,

si je ne m'abuse, Le constructeur de TObject n'est pas virtual, ni dynamic (voir system.pas)

  TObject = class
    constructor Create;
    procedure Free;
    class function InitInstance(Instance: Pointer): TObject;
    procedure CleanupInstance;
    function ClassType: TClass;
    class function ClassName: ShortString;
    class function ClassNameIs(const Name: string): Boolean;
    class function ClassParent: TClass;
    class function ClassInfo: Pointer;
    class function InstanceSize: Longint;
    class function InheritsFrom(AClass: TClass): Boolean;
    class function MethodAddress(const Name: ShortString): Pointer;
    class function MethodName(Address: Pointer): ShortString;
    function FieldAddress(const Name: ShortString): Pointer;
    function GetInterface(const IID: TGUID; out Obj): Boolean;
    class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
    class function GetInterfaceTable: PInterfaceTable;
    function SafeCallException(ExceptObject: TObject;
      ExceptAddr: Pointer): HResult; virtual;
    procedure AfterConstruction; virtual;
    procedure BeforeDestruction; virtual;
    procedure Dispatch(var Message); virtual;
    procedure DefaultHandler(var Message); virtual;
    class function NewInstance: TObject; virtual;
    procedure FreeInstance; virtual;
    destructor Destroy; virtual;
  end;

constructor TObject.Create;
begin
end;

Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011

Tout est clair..
Un grand merci pour ta réponse ! (et bon été)
@+ JJT
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011

le source que tu cites paraît effectivement clair à ce sujet..
et ce n'est qu'au niveau de TComponent que semble débarquer le virtual (comme le montre Mauricio ci-dessus).
merci pour ton post qui m'éclaicit bien TObject.
@+ JJT