Appel des constructeurs et des destructeurs
Soit B une classe dérivée d’une classe de base A. Naturellement, dès lors que B possède
au moins un constructeur, la création d’un objet de type B implique obligatoirement
l’appel d’un constructeur de B. Mais, de plus, ce constructeur de B doit prévoir des
arguments à destination d’un constructeur de A (une exception a lieu soit si A n’a pas de
constructeur, soit si A possède un constructeur sans argument). Ces arguments sont
précisés dans la définition du constructeur de B, comme dans cet exemple :
B (int x, int y, char coul) : A (x, y) ;
Les arguments mentionnés pour A peuvent éventuellement l’être sous forme
d’expressions.
Cas particulier du constructeur par recopie
En plus des règles ci-dessus, il faut ajouter que si la classe dérivée B ne possède pas de
constructeur par recopie, il y aura appel du constructeur par recopie par défaut de B,
lequel procédera ainsi :
appel du constructeur par recopie de A (soit celui qui y a été défini, soit le
constructeur par recopie par défaut) ;
initialisation des membres donnée de B qui ne sont pas hérités de A.
En revanche, un problème se pose lorsque la classe dérivée définit explicitement un
constructeur par recopie. En effet, dans ce cas, il faut tenir compte de ce que l’appel de
ce constructeur par recopie entraînera l’appel :
du constructeur de la classe de base mentionné dans son en-tête, comme dans cet
exemple (il s’agit ici d’un constructeur par recopie de la classe de base, mais il
pourrait s’agir de n’importe quel autre constructeur) :
B (B & b) : A(b) ; // appel du constructeur par recopie de A
// auquel sera transmise la partie de B héritée de A
// (grâce aux règles de compatibilité entre
// classe dérivée et classe de base)
d’un constructeur sans argument, si aucun constructeur de la classe de base n’est
mentionné dans l’en-tête ; dans ce cas, il est nécessaire que la classe de base
dispose d’un tel constructeur sans argument, faute de quoi on obtiendrait une erreur
de compilation.
Conséquences de l’héritage
242
Soit B une classe dérivée d’une classe de base A. Naturellement, dès lors que B possède
au moins un constructeur, la création d’un objet de type B implique obligatoirement
l’appel d’un constructeur de B. Mais, de plus, ce constructeur de B doit prévoir des
arguments à destination d’un constructeur de A (une exception a lieu soit si A n’a pas de
constructeur, soit si A possède un constructeur sans argument). Ces arguments sont
précisés dans la définition du constructeur de B, comme dans cet exemple :
B (int x, int y, char coul) : A (x, y) ;
Les arguments mentionnés pour A peuvent éventuellement l’être sous forme
d’expressions.
Cas particulier du constructeur par recopie
En plus des règles ci-dessus, il faut ajouter que si la classe dérivée B ne possède pas de
constructeur par recopie, il y aura appel du constructeur par recopie par défaut de B,
lequel procédera ainsi :
appel du constructeur par recopie de A (soit celui qui y a été défini, soit le
constructeur par recopie par défaut) ;
initialisation des membres donnée de B qui ne sont pas hérités de A.
En revanche, un problème se pose lorsque la classe dérivée définit explicitement un
constructeur par recopie. En effet, dans ce cas, il faut tenir compte de ce que l’appel de
ce constructeur par recopie entraînera l’appel :
du constructeur de la classe de base mentionné dans son en-tête, comme dans cet
exemple (il s’agit ici d’un constructeur par recopie de la classe de base, mais il
pourrait s’agir de n’importe quel autre constructeur) :
B (B & b) : A(b) ; // appel du constructeur par recopie de A
// auquel sera transmise la partie de B héritée de A
// (grâce aux règles de compatibilité entre
// classe dérivée et classe de base)
d’un constructeur sans argument, si aucun constructeur de la classe de base n’est
mentionné dans l’en-tête ; dans ce cas, il est nécessaire que la classe de base
dispose d’un tel constructeur sans argument, faute de quoi on obtiendrait une erreur
de compilation.
Conséquences de l’héritage
242
