Héritage virtuel

Nous avons dit précédemment que si deux classes A et B dérivent d’une 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 lorsqu’il n’est 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 qu’une instance de Z. Les classes A et B sont identiques à ce qu’elles étaient auparavant, sauf que le compilateur sait que l’instance de Z peut être à un emplacement inhabituel (c’est le cas dans C) ; les deux classes doivent être dérivées virtuellement de Z.

On notera que dans ce cas, il n’y a pas d’ambiguïté lorsqu’on utilise avec une instance de C les membres hérités de Z (alors qu’il y en a une si la dérivation n’est pas virtuelle, même pour les méthodes puisqu’elles ne savent sur quel instance s’appliquer si l’on n’utilise 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, c’est la méthode redéfinie, et non la méthode de Z, qui sera utilisée.

Précédent Précédent Sommaire Sommaire Suivant Suivant