Classes de base virtuelles

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Classes - Index

Une classe virtual est une classe de base transmise à plus d'une classe dérivée, ce qui peut arriver avec l'héritage multiple.

Une classe de base ne peut être spécifiée qu'une seule fois dans une classe dérivée :



 class B { ... };
 class D : B; B { ... }; //ILLEGAL



Toutefois, la transmission indirecte de la classe de base dans la classe dérivée est possible plusieurs fois :



 class X : public B { ... };
 class Y : public B { ... };
 class Z : public X, public Y { ... }; //OK



Dans ce cas, chaque objet de la classe Z aura deux sous-objets de la classe B.

Si cela pose problème, vous pouvez ajouter le mot clé virtual à un spécificateur de classe de base. Par exemple,



 class X : virtual public B { ... };
 class Y : virtual public B { ... };
 class Z : public X, public Y { ... };



B est maintenant une classe de base virtuelle et la classe Z ne possède qu'un sous-objet de la classe B.

Constructeurs pour les classes de base virtuelles

Les constructeurs des classes de base virtuelles sont appelés avant toutes les autres classes de base non virtuelles.

Si la hiérarchie contient plusieurs classes de base virtuelles, leurs constructeurs sont appelés dans l'ordre des déclarations des classes.

Toute base non virtuelle est ensuite construite avant que le constructeur de classe dérivée ne soit appelé.

Si une classe virtuelle dérive d'une classe de base non virtuelle, celle-ci apparaît en premier, afin que la construction de la classe de base virtuelle soit correcte. Par exemple, ce code



 class X : public Y, virtual public Z
  X one;



produit l'ordre suivant :



 Z(); // initialisation de classe de base virtuelle
 Y();   // classe de base non virtuelle
 X();   // classe dérivée



Voir aussi