C de problèmes d'héritage du diamant et des solutions

1. Il a hérité d' un diamant?
Insérer ici l'image Description
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:
Insérer ici l'image Description
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:
Insérer ici l'image Description
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
Insérer ici l'image Description
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.

Publié 239 articles originaux · louange gagné 3 · Vues 3143

Je suppose que tu aimes

Origine blog.csdn.net/it_xiangqiang/article/details/105177007
conseillé
Classement