Constructeurs et destructeurs

Lorsque la classe de base possède un constructeur par défaut, celui-ci est appelé automatiquement avant l’appel du constructeur de la classe dérivée, pour initialiser les données membres de base. Il est cependant permis à un constructeur de la classe dérivée de faire un appel explicite à un constructeur de la classe de base, afin d’initialiser les membres hérités ; cet appel se fait de la même façon que pour les membres qui sont des classes (chapitre 5), c’est-à-dire en plaçant derrière la liste des arguments le symbole : puis le nom de la classe de base (qui est aussi celui de son constructeur) avec ses arguments. Voici donc comment définir de manière naturelle les deux constructeurs de la classe rectplein :

rectplein::rectplein(){     // appel implicite de rectangle::rectangle();     couleur = 0;}rectplein::rectplein(int gche, int haut,             int drte, int bas, int couleur)              : rectangle(gche, haut, drte, bas)    // explicite{     coul = couleur;     trace();}

Le premier constructeur appelle en fait le constructeur par défaut de rectangle (qui crée un rectangle vide), ce qu’il n’est pas nécessaire de préciser. Par contre, dans le second, on souhaite utiliser l’autre constructeur (qui crée un rectangle à partir de ses coordonnées), et il faut alors le mentionner explicitement.

Il résulte de ces règles que lorsqu’une classe n’a pas de constructeur par défaut, les classes dérivées doivent obligatoirement appeler un constructeur de la classe de base.

Le destructeur d’une classe dérivée appelle le destructeur de la classe de base après l’exécution de ses tâches explicites. Ainsi on peut écrire :

rectplein::~rectplein(){     efface();     // appel implicite de rectangle::~rectangle();}

Comme il n’y a qu’un destructeur par classe, il n’y a pas à choisir.

On retiendra que les constructeurs sont appelés dans l’ordre ascendant des classes (de base vers dérivées), tandis que les destructeurs le sont dans l’ordre inverse. Il s’agit bien là d’un ordre conforme à la logique. En effet, le constructeur d’une classe dérivée peut avoir besoin des membres de la classe de base (c’est le cas dans notre exemple, puisque la fonction trace utilise les coordonnées du rectangle) : il en résulte que la partie de base de l’objet doit être initialisée avant qu’on ne commence la construction explicite. Inversement, le destructeur aussi peut avoir besoin des membres hérités : il ne faut donc pas les détruire en premier, mais seulement après.

Précédent Précédent Sommaire Sommaire Suivant Suivant