1. Il a hérité d' un diamant?
Deux sous - classes héritent de la même classe parente et la sous - classe et il y a deux sous - classes héritent, ils disent que la figure ci - dessus montre.
Afficher le code
Problèmes, produiront l'ambiguïté problème qui appelle à la portée BaseClass pour expliquer la situation:
D * pd = nouveau D;
PD-> B :: a = 1;
PD-> C :: a = 2;
printf ( "% d \ n", PD-> B :: a);
printf ( "% d \ n", PD-> C :: a);
Il y a deux BaseClass équivalents, cela ne peut être le résultat que nous voulons, plus difficile à l'appel, mais aussi un gaspillage de ressources mémoire dans la classe.
Cette structure est représentée:
voir le point A de la position de la table de fonctions virtuelles ne sont pas les mêmes, à savoir, il y a deux cas BaseClass !!
2. Comment résoudre?
Utilisez l'héritage virtuel!
Afficher le code
Disposition de la mémoire:
deux pour BaseClass est commune, qui est, BaseClass instancier un objet Pensez à ce qui se passera d'appeler B, C lorsque la fonction virtuelle sur une table virtuelle comment la ligne, donc il y a un besoin correspondant !? table virtuelle de points correspondant B, C, de sorte qu'il devient la structure ci - dessus.
! Debugging observé, il est vraiment le cas
sommaire: Vous pouvez supprimer l' ambiguïté par l' héritage virtuel, l' héritage virtuel , mais le coût est d'augmenter le pointeur de fonction virtuelle.