Surcharge - Constructeurs

Résolu
cs_PtitTrain Messages postés 28 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 25 juillet 2011 - 23 juil. 2011 à 07:50
cs_PtitTrain Messages postés 28 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 25 juillet 2011 - 25 juil. 2011 à 16:13
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

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
25 juil. 2011 à 11:11
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
3
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
25 juil. 2011 à 11:20
Bonnes vacances et n' oublie pas de valider la réponse! ^^
A+


Composants Cindy pour Delphi
3
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
25 juil. 2011 à 12:58
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;

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_PtitTrain Messages postés 28 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 25 juillet 2011
25 juil. 2011 à 16:13
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
0