class B : public A
{ ..... } ;
class C : public A
{ ..... } ;
class D : public B, public C
{ ..... } ;
Dans ce cas, les membres donnée de la classe en question (A dans notre exemple)
apparaissent deux fois dans la classe dérivée de deuxième niveau (ici D).
Naturellement, il est nécessaire de faire appel à l’opérateur de résolution de portée (::)
pour lever l’ambiguïté. Si l’on souhaite que de tels membres n’apparaissent qu’une
seule fois dans la classe dérivée de deuxième niveau, il faut, dans les déclarations des
dérivées de premier niveau (ici B et C) déclarer avec l’attribut virtual la classe dont on
veut éviter la duplication (ici A).
Voici comment on procéderait dans l’exemple précédent (le mot virtual peut être
indifféremment placé avant ou après le mot public ou le mot private) :
class B : public virtual A
{ ..... } ;
class C : public virtual A
{ ..... } ;
class D : public B, public C
{ ..... } ;
Lorsqu’on a ainsi déclaré une classe virtuelle, il est nécessaire que les constructeurs
d’éventuelles classes dérivées puissent préciser les informations à transmettre au
constructeur de cette classe virtuelle (dans le cas usuel où l’on autorise la duplication,
ce problème ne se pose plus ; en effet, chaque constructeur transmet les informations
aux classes ascendantes dont les constructeurs transmettent, à leur tour, les informations
aux constructeurs de chacune des occurrences de la classe en question – ces
informations pouvant éventuellement être différentes). Dans ce cas, on le précise dans
l’en-tête du constructeur de la classe dérivée, en plus des arguments destinés aux
constructeurs des classes du niveau immédiatement supérieur, comme dans cet
exemple :
D ( .....) : B (.....), C ( ..... ), A ( ..... )
| | | |
| | | |
arguments arguments arguments arguments
de D pour B pour C pour A
De plus, dans ce cas, les constructeurs des classes B et C (qui ont déclaré que A était
« virtuelle ») n’auront plus à spécifier d’informations pour un constructeur de A.
Enfin, le constructeur d’une classe virtuelle est toujours appelé avant les autres.
262
Précédent

- 263/398

Suivant