Análisis detallado del proceso de herencia virtual para resolver el problema de ambigüedad causado por la herencia de diamantes

 二义性问题请详细看:

http://blog.csdn.net/lxp_mujinhuakai/article/details/69414277 Para
solucionar el problema del artículo anterior, mira el siguiente código:

#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;
}

El resultado se muestra en la siguiente figura:

Escriba la descripción de la imagen aquí
Podemos comprobar la memoria del objeto para conocer el número específico almacenado en la memoria:

, Romper el punto en ptr = & d, cuando el programa se ejecute en este punto, imprima & d en la ventana de memoria, para que pueda ver la memoria del objeto d * , como se muestra en la figura: *
Escriba la descripción de la imagen aquí

Una dirección se almacena en la primera dirección de la memoria, ingresamos esta dirección 0x00eadc98 en la memoria y revisamos nuevamente lo que está almacenado en esta dirección, como se muestra en la figura:

Escriba la descripción de la imagen aquí

Se puede ver que la primera fila de las dos primeras filas almacena el desplazamiento del objeto de clase base basado en la clase base, que es 0. La segunda línea almacena el desplazamiento 8 del objeto de clase derivada d basado en la clase base. A continuación se resume el proceso de implementación específico de la herencia virtual.


¿Cómo sabe el objeto a qué miembro se está llamando? El proceso específico es el siguiente:
1. El puntero o referencia sabe a qué objeto llamó;
2. El objeto puede obtener la dirección que almacena el desplazamiento en función de la clase base;
3. Obtenga la clase base en función del desplazamiento de la dirección;
4 mediante el cual este puntero de objeto de clase base más el desplazamiento, la llamada puede distinguir qué miembros de la clase derivada a qué objeto.

Nota:
1. Después de agregar la palabra clave virtual, se asignarán 4 bytes más para que el objeto de clase derivada almacene la dirección en función del desplazamiento de la clase base (que aparece en el paso 2).
2. Después de agregar la palabra clave virtual, el tamaño heredado del diamante es de solo 4 bytes, en lugar de 8. Porque los miembros de la clase base solo abren un espacio.
3. Para resolver el problema de ambigüedad, la palabra clave virtual debe agregarse antes del método de herencia de la posición cuando las dos clases derivadas heredan la clase base por primera vez.

Supongo que te gusta

Origin blog.csdn.net/lxp_mujinhuakai/article/details/69427582
Recomendado
Clasificación