10
votes

Tables virtuelles et pointeurs virtuels pour multiples héritage virtuel et coulée de type

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.

  1. considère b hérités de A et les deux définissent les fonctions virtuelles f () . 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] et le vtbl que vptr points à contient b :: f () . J'ai aussi compris que la coulée de l'objet de B à a ne fait rien, sauf ignorer la pièce B à la fin de l'objet. Est-ce vrai? Ce comportement n'est-il pas faux? Nous voulons cet objet de type A pour exécuter A :: F () méthode et non b :: f () . .

  2. existe un certain nombre de VTABLE dans le système comme nombre de classes?

  3. Comment un willable 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?

  4. même que la question 3 mais avec héritage virtuel.


0 commentaires

3 Réponses :


2
votes
  1. Cela me semble correct. Ce n'est pas faux, comme si vous utilisez un pointeur, vous n'avez besoin que de la fourniture de mises en œuvre de fonctions B disponibles à partir de la machine à distribuer (il peut y avoir plusieurs tablevis, en fonction de la complexité du compilateur et de la hiérarchie).
  2. Je dirais oui, mais c'est une mise en œuvre du compilateur dépendante de sorte que vous n'êtes pas vraiment obligé de le savoir.
  3. et 4. Lisez plus loin.

    Je recommanderais de lire Plusieurs héritage Considéré comme utile , c'est un long article, mais cela rend les choses plus claires sur le sujet, car il explique dans d'excellents détails. Comment l'héritage fonctionne en C ++ (les liens des chiffres ne fonctionnent pas, mais ils sont disponibles au fond de la page).


0 commentaires

16
votes

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>

  1. 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 -------------|
    


0 commentaires

-1
votes
  1. si l'objet B hérite de A alors la représentation de la mémoire pour B sera la suivante:

    • Pointeur sur la table virtuelle d'un
    • variables / fonctions spécifiques
    • Pointeur sur la table virtuelle de B
    • b variables spécifiques / fonctions / remplacement

      Si vous avez B * B = New B (); (A) b-> f () alors:

      • Si f a été déclaré comme une fonction virtuelle, la mise en œuvre de B est appelée parce que b est de type B
      • Si f n'a été pas déclaré comme une fonction virtuelle, alors quand l'appelé, il n'y aura pas de recherche dans la mesure de la mise en œuvre correcte et que la mise en œuvre d'A sera appelée.
      • Chaque objet aura sa propre salle à manger (ne prenez pas ceci pour acquis, car je dois la rechercher

      • Regardez à Ceci pour un exemple de la couche de table à usage équitable lorsqu'il s'agit de Héritage multiple

      • voir Ceci pour une discussion sur l'héritage de diamant et la représentation de la fourchette < / p>


2 commentaires

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 n'est pas un point de déclenchement du pointeur, vous construisez un autre objet