Nous avons dit précédemment que si deux classes A
et B
dérivent dune même troisième Z
, une dérivation de A
et B
placera dans la classe dérivée C
deux copies de Z
.
Il est possible déviter ce comportement lorsquil nest pas souhaitable. Il faut pour cela que les classes A
et B
aient été dérivées de manière virtuelle de Z
:
class Z { ... }; class A : virtual public Z { ... }; class B : virtual Z { ... }; class C : public A, B { ... };
La classe C
dans ce cas ne contient quune instance de Z
. Les classes A
et B
sont identiques à ce quelles étaient auparavant, sauf que le compilateur sait que linstance de Z
peut être à un emplacement inhabituel (cest le cas dans C
) ; les deux classes doivent être dérivées virtuellement de Z
.
On notera que dans ce cas, il ny a pas dambiguïté lorsquon utilise avec une instance de C
les membres hérités de Z
(alors quil y en a une si la dérivation nest pas virtuelle, même pour les méthodes puisquelles ne savent sur quel instance sappliquer si lon nutilise pas un spécificateur A::
ou B::
), sauf si les deux classes intermédiaires ont redéfini une méthode virtuelle de Z
(auquel cas le compilateur ne peut choisir) ; si une seule des deux classes intermédiaires a redéfini une méthode virtuelle de Z
, cest la méthode redéfinie, et non la méthode de Z
, qui sera utilisée.
Précédent | Sommaire | Suivant |