Analyse détaillée du processus d'héritage virtuel pour résoudre le problème d'ambiguïté causé par l'héritage du diamant

 二义性问题请详细看:

http://blog.csdn.net/lxp_mujinhuakai/article/details/69414277 Pour
résoudre le problème de l'article précédent, consultez le code suivant:

#include<iostream>
using namespace std;

class Grandam
{
public:
     void introduce_self()
    {
        cout << "I am grandam." << endl;
    }
};

class Mother :virtual public Grandam
{
public:
    void introduce_self()
    {
        cout << "I am mother." << endl;
    }
};

class Aunt :virtual public Grandam
{
public:
    void introduce_self()
    {
        cout << "I am aunt." << endl;
    }
};

class Daughter :public Mother,public Aunt
{
public:
    void introduce_self()
    {
        cout << "I am daughter." << endl;
    }
};

int main()
{
    Grandam* ptr;
    Daughter d;
    ptr = &d;
    ptr->introduce_self();
    return 0;
}

Le résultat est montré dans la figure ci-dessous:

Écrivez la description de l'image ici
Nous pouvons vérifier la mémoire de l'objet pour connaître le numéro spécifique stocké dans la mémoire:

, Cassez le point à ptr = & d, lorsque le programme s'exécute à ce point, imprimez & d dans la fenêtre de mémoire, afin que vous puissiez voir la mémoire de l'objet d * , comme indiqué sur la figure: *
Écrivez la description de l'image ici

Une adresse est stockée dans la première adresse de la mémoire. Nous saisissons cette adresse 0x00eadc98 dans la mémoire et vérifions à nouveau ce qui est stocké dans cette adresse, comme le montre la figure:

Écrivez la description de l'image ici

On peut voir que la première ligne des deux premières lignes stocke le décalage de l'objet de classe de base basé sur la classe de base, qui est 0. La deuxième ligne stocke le décalage 8 de l'objet de classe dérivé d en fonction de la classe de base. Ce qui suit résume le processus d'implémentation spécifique de l'héritage virtuel.


Comment l'objet sait-il quel membre est appelé? Le processus spécifique est le suivant:
1. Le pointeur ou la référence sait quel objet vous avez appelé;
2. L'objet peut obtenir l'adresse qui stocke le décalage en fonction de la classe de base;
3. Obtenez la classe de base en fonction du décalage d'adresse;
4 grâce à quoi ce pointeur d'objet de classe de base plus le décalage, l'appel peut distinguer quels membres de la classe dérivée vers quel objet.

Remarque:
1. Une fois le mot-clé virtual ajouté, 4 octets supplémentaires seront alloués à l'objet de classe dérivé pour stocker l'adresse en fonction du décalage de la classe de base (qui apparaît à l'étape 2).
2. Après avoir ajouté le mot-clé virtual, la taille héritée du losange n'est que de 4 octets au lieu de 8. Parce que les membres de la classe de base n'ouvrent qu'un espace.
3. Pour résoudre le problème d'ambiguïté, le mot-clé virtual doit être ajouté avant la méthode d'héritage de la position lorsque les deux classes dérivées héritent de la classe de base pour la première fois.

Je suppose que tu aimes

Origine blog.csdn.net/lxp_mujinhuakai/article/details/69427582
conseillé
Classement