Destructores virtuales y eliminación de objetos con herencia múltiple ... ¿Cómo funciona?

Primero entiendo porquevirtual los destructores son necesarios en términos de herencia única y eliminación de un objeto a través de un puntero base. Esto es específicamente sobre la herencia múltiple y la razón detrás depor qué esto funciona. Esta pregunta surgió en una de mis clases universitarias, y nadie (incluido el profesor) estaba seguro de por qué funcionaba esto:

#include <iostream>

struct A
{
    virtual ~A()
    {
        std::cout << "~A" << std::endl;
    }
    int memberA;
};

struct B
{
    virtual ~B()
    {
        std::cout << "~B" << std::endl;
    }
    int memberB;
};

struct AB : public A, public B
{
    virtual ~AB()
    {
        std::cout << "~AB" << std::endl;
    }
};

int main()
{
    AB* ab1 = new AB();
    AB* ab2 = new AB();

    A* a = ab1;
    B* b = ab2;

    delete a;
    delete b;
}

La salida para esto es:

~AB
~B
~A
~AB
~B
~A

¿Cómo sabe el compilador cómo llamar?AyBdel destructor al eliminara ob? En concreto, ¿cómo es la memoria paraAB distribuido (particularmente su tabla de funciones virtuales), de modo que laA yB ¿Se pueden llamar destructores?

Mi profesor estaba sugiriendo que la memoria se presentaría (algo) así:

    AB
+---------+              +----+
|  A VFT  | - - - - - -> | ~A |
+---------+              +----+
| memberA |
+---------+              +----+
|  B VFT  | - - - - - -> | ~B |
+---------+              +----+
| memberB |
+---------+

// I have no idea where ~AB would go...

Todos estamos curiosos de cómo estos destructores están realmente dispuestos en la memoria y cómo llamardelete en cualquieraa ob resulta en que todos los destructores sean llamados apropiadamente. Tiene sentido que eliminar un objeto base funcione en herencia única (porque hay una sola tabla de funciones virtuales con la que trabajar), pero aparentemente no entiendo las cosas correctamente porque no puedo entender mi versión de la herencia única y aplicarla a este ejemplo de herencia múltiple.

Entonces, ¿cómo funciona esto?

Respuestas a la pregunta(4)

Su respuesta a la pregunta