Construction d'objets pour les bibliothèques C++Builder

De RAD Studio
Aller à : navigation, rechercher

Remonter à Modèles C++ et Pascal Objet


Le C++Builder et le Delphi construisent différemment les objets. Cette section aborde cette question et décrit comment C++Builder combine les deux approches.

Construction d’objets C++

En C++ standard, l’ordre de construction va des classes virtuelles de base, suivies des classes de base et enfin de la classe dérivée. La syntaxe C++ utilise la liste d’initialisation du constructeur pour appeler les constructeurs des classes de base. Le type à l’exécution de l’objet est celui de la classe dont c’est le constructeur qui est appelé. La répartition des méthodes virtuelles respecte le type à l’exécution de l’objet et change en conséquence pendant la construction.

Construction d’objets Delphi

En Delphi, seul le constructeur de la classe instanciée est appelé de manière certaine ; cependant la mémoire des classes de base est allouée. La construction de chaque classe de base immédiate est assurée en appelant inherited dans le constructeur de la classe dérivée correspondante. Par convention, les classes dans les bibliothèques VCL,RTL et FireMonkey utilisent inherited pour appeler les constructeurs (non vides) des classes de base. Attention, car ce n’est pourtant pas une règle impérative du langage. Le type à l’exécution de l’objet est immédiatement déterminé comme étant celui de la classe instanciée et ne change pas quand les constructeurs des classes de base sont appelés. La répartition des méthodes virtuelles s’effectue en fonction du type à l’exécution de l’objet et ne change donc pas au cours de la construction.

Construction d'objets C++Builder

Les objets de style Delphi sont construits comme tout objet Pascal Objet mais avec une syntaxe C++. Cela signifie que la méthode et l'ordre d'appel des constructeurs des classes de base respectent la syntaxe C++ en utilisant la liste d'initialisation de toutes les classes de base non VCL, non RTL, non FireMonkey et le premier ancêtre immédiat VCL-RTL-FireMonkey. Cette classe de base VCL-RTL-FireMonkey est la première classe construite. Elle construit, de manière optionnelle, sa propre classe de base en utilisant inherited selon la méthode Pascal Objet. Cependant, les classes de base VCL-RTL-FireMonkey sont construites dans l'ordre inverse de celui attendu en C++. Toutes les classes de base C++ sont ensuite construites en partant de l’ancêtre le plus éloigné jusqu’à la classe dérivée. Le type à l’exécution de l’objet et la répartition des méthodes virtuelles est de type Pascal Objet.

La figure suivante illustre la construction d’une instance d’une classe de style VCL, MyDerived, qui dérive de MyBase, descendant direct de TWinControl. MyDerived et MyBase sont implémentées en C++. TWinControl est une classe VCL implémentée en Pascal Objet.

Order of Construction.png

Ordre de construction d'héritage

Remarque : L'ordre de construction peut sembler aller à l'inverse de celui attendu par un programmeur C++, car il va de l'ancêtre immédiat jusqu'à TObject pour les classes purement VCL-RTL-FireMonkey, puis construit MyBase et enfin la classe dérivée.

Remarque : TComponent n’appelle pas inherited car TPersistent n’a pas de constructeur. TObject a un constructeur vide, il n’est donc pas appelé. Si les constructeurs de ces classes étaient appelés, l’ordre suivrait le schéma dans lequel ces classes apparaissent en gris.

Les modèles de construction d'objet en C++, Pascal Objet et C++Builder sont résumés dans le tableau suivant :


Comparaison des modèles objet

C++ Pascal Objet C++Builder
Ordre de construction

Les classes de base virtuelles puis les classes de base et enfin la classe dérivée.

Le constructeur de la classe instancié est le premier et seul constructeur appelé automatiquement. Si d’autres classes sont construites, elles le sont depuis l’extrémité jusqu’à la racine.

La classe de base VCL-RTL-FireMonkey la plus proche, puis la construction suit le modèle Pascal Objet, enfin la construction suit le modèle C++ (à cette différence que les classes de base virtuelles ne sont pas autorisées).

Méthode d'appel des constructeurs de la classe de base

Automatiquement à partir de la liste d’initialisation du constructeur.

De manière optionnelle et explicitement n’importe où dans le corps du constructeur de la classe dérivée en utilisant le mot clé inherited.

Automatiquement à partir de la liste d'initialisation du constructeur jusqu’au constructeur de la classe de base VCL-RTL-FireMonkey la plus proche. Ensuite, suivant la méthode Pascal Objet en appelant les constructeurs avec inherited.

Type à l'exécution de l'objet pendant sa construction

Change en fonction du type de constructeur de classe en cours.

Défini immédiatement comme étant celui de la classe instanciée.

Défini immédiatement comme étant celui de la classe instanciée.

Répartition de méthode virtuelle

Change en fonction du type à l’exécution de l’objet au fil de l’appel des constructeurs des classes de base.

Respecte le type à l’exécution de l’objet qui reste le même tout au long de l’appel de tous les constructeurs de classe.

Respecte le type à l’exécution de l’objet qui reste le même tout au long de l’appel de tous les constructeurs de classe.


La section Appels de méthodes virtuelles dans les constructeurs des classes de base décrit la signification de ces différences.

Voir aussi