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.
| Suivant |