Je suis peu confus au sujet de la VPTR et de la représentation des objets dans la mémoire et j'espère que vous pourrez m'aider à mieux comprendre la matière meilleure. P>
considère existe un certain nombre de Comment un même que la question 3 mais avec héritage virtuel. p> li>
ol> b code> hérités de
A code> et les deux définissent les fonctions virtuelles
f () code>. D'après ce que j'ai appris, la représentation d'un objet de classe B dans la mémoire ressemble à ceci:
[VPTR | Un | B] code>
et le
vtbl code> que
vptr code> points à contient
b :: f () code>. J'ai aussi compris que la coulée de l'objet de
B code> à
a code> ne fait rien, sauf ignorer la pièce
B code> à la fin de l'objet. Est-ce vrai? Ce comportement n'est-il pas faux? Nous voulons cet objet de type
A code> pour exécuter
A :: F () code> méthode et non
b :: f () code>. P>. li>
VTABLE code> dans le système comme nombre de classes? p> li>
willable code> de classe qui hérite de deux classes ou plus ressemblent? Comment l'objet de C sera-t-il représenté dans la mémoire? P> LI>
3 Réponses :
Ce qui suit est vrai pour GCC (et il semble vrai pour LLVM lien ) , mais peut également être vrai pour le compilateur que vous utilisez. Tous ceux-ci sont dépendants de la mise en œuvre et ne sont pas régis par la norme C ++. Cependant, GCC écrit son propre document standard binaire, Itanium ABI .
J'ai essayé d'expliquer des concepts de base sur la manière dont les tables virtuelles sont définies dans des mots plus simples dans la partie de mon article sur virtuel Performances de fonction en C ++ , que vous pourriez trouver utiles. Voici des réponses à vos questions: P>
Un moyen plus correct de représenter la représentation interne de l'objet est la suivante: p>
| C::func() | a() | c() || C::func() | b() | |---- vtable for A ----| |---- vtable for B ----| |--- "primary virtual table" --||- "secondary vtable" -| |-------------- virtual table group for C -------------|
si l'objet B hérite de A alors la représentation de la mémoire pour B sera la suivante: p>
Si vous avez B * B = New B (); (A) b-> f () alors: p>
Chaque objet aura sa propre salle à manger (ne prenez pas ceci pour acquis, car je dois la rechercher p> Li>
Regardez à Ceci pour un exemple de la couche de table à usage équitable lorsqu'il s'agit de Héritage multiple p> li>
voir Ceci pour une discussion sur l'héritage de diamant et la représentation de la fourchette < / p> li> ol>
Le compilateur réutilisera le pointeur de la table virtuelle (VPTR) de la classe de base SubObject autant que possible et évitez le VPTR supplémentaire, sauf si nécessaire.
(a) b code> n'est pas un point de déclenchement du pointeur, vous construisez un autre objet