Rappels
Depuis la version 2.0, C++ autorise l’héritage multiple : une classe peut hériter de
plusieurs autres classes, comme dans cet exemple où la classe pointcol hérite
simultanément des classes point et coul :
class pointcol : public point, public coul // chaque dérivation, ici publique
// pourrait être privée ou protégée
{ // définition des membres supplémentaires (données ou fonctions)
// ou redéfinition de membres existants déjà dans point ou coul
} ;
Chacune des dérivations peut être publique, privée ou protégée. Les modalités d’accès
aux membres de chacune des classes de base restent les mêmes que dans le cas d’une
dérivation « simple ». L’opérateur de résolution de portée (::) peut être utilisé :
soit lorsque l’on veut accéder à un membre d’une des classes de base, alors qu’il est
redéfini dans la classe dérivée,
soit lorsque deux classes de base possèdent un membre de même nom et qu’il faut
alors préciser celui qui nous intéresse.
Appel des constructeurs et des destructeurs
La création d’un objet entraîne l’appel du constructeur de chacune des classes de base,
dans l’ordre où ces constructeurs sont mentionnés dans la déclaration de la classe
dérivée (ici, point puis coul puisque nous avons écrit class pointcol : public point, public
coul). Les destructeurs sont appelés dans l’ordre inverse.
Le constructeur de la classe dérivée peut mentionner, dans son en-tête, des informations
à retransmettre à chacun des constructeurs des classes de base (ce sera généralement
indispensable, sauf si une classe de base possède un constructeur sans argument ou si
elle ne dispose pas du tout de constructeur). En voici un exemple :
pointcoul ( .....) : point (.....), coul (.....)
| | |
| | |
arguments arguments arguments
pointcoul point coul
Classes virtuelles
Par le biais de dérivations successives, il est tout à fait possible qu’une classe hérite
deux fois d’une même classe. En voici un exemple dans lequel D hérite deux fois de A :
261
Depuis la version 2.0, C++ autorise l’héritage multiple : une classe peut hériter de
plusieurs autres classes, comme dans cet exemple où la classe pointcol hérite
simultanément des classes point et coul :
class pointcol : public point, public coul // chaque dérivation, ici publique
// pourrait être privée ou protégée
{ // définition des membres supplémentaires (données ou fonctions)
// ou redéfinition de membres existants déjà dans point ou coul
} ;
Chacune des dérivations peut être publique, privée ou protégée. Les modalités d’accès
aux membres de chacune des classes de base restent les mêmes que dans le cas d’une
dérivation « simple ». L’opérateur de résolution de portée (::) peut être utilisé :
soit lorsque l’on veut accéder à un membre d’une des classes de base, alors qu’il est
redéfini dans la classe dérivée,
soit lorsque deux classes de base possèdent un membre de même nom et qu’il faut
alors préciser celui qui nous intéresse.
Appel des constructeurs et des destructeurs
La création d’un objet entraîne l’appel du constructeur de chacune des classes de base,
dans l’ordre où ces constructeurs sont mentionnés dans la déclaration de la classe
dérivée (ici, point puis coul puisque nous avons écrit class pointcol : public point, public
coul). Les destructeurs sont appelés dans l’ordre inverse.
Le constructeur de la classe dérivée peut mentionner, dans son en-tête, des informations
à retransmettre à chacun des constructeurs des classes de base (ce sera généralement
indispensable, sauf si une classe de base possède un constructeur sans argument ou si
elle ne dispose pas du tout de constructeur). En voici un exemple :
pointcoul ( .....) : point (.....), coul (.....)
| | |
| | |
arguments arguments arguments
pointcoul point coul
Classes virtuelles
Par le biais de dérivations successives, il est tout à fait possible qu’une classe hérite
deux fois d’une même classe. En voici un exemple dans lequel D hérite deux fois de A :
261
