Imaginons l’héritage multiple qui suit :

Dans l’exemple ci-dessus, la classe maClasse4
va hériter deux fois du membre a de maClasse1.
Une fois par maClasse2 et une fois par maClasse3.
Nous aurons donc deux fois le membre a ce qui va provoquer
une ambiguïté.
Ce problème se résout en utilisant l’opérateur
de résolution de portée ( : : ) :
Exemple :
void main() {
maClasse4 c4;
c4.a = 0; // ERREUR, ambiguïté
c4.maClasse2 :: a = 1; // OK
c4.maClasse3 :: a = 2; // OK
}
Néanmoins, cette solution n’est pas satisfaisante
puisque nous nous retrouvons avec deux instances du membre
a. La solution pour n’en n’avoir qu’une
est d’utiliser l’héritage virtuel.
Si l’on veut que maClasse2 et maClasse3
n’héritent qu’une seule fois de maClasse1,
il faut qu’elles héritent virtuellement de
cette dernière.

Il ne faut pas confondre l’héritage virtuel
avec les membres de classes virtuels. Ici, le mot clé
virtual ne sert qu’à indiquer au compilateur
les classes à ne pas dupliquer.