Herencia múltiple

#include<iostream>
using namespace std;

class A

{
   int a;
   int b;
   public:
   void eat()
   {
      cout<<"A::eat()"<<endl;
   }
};

class B: public A
{
   public:
   void eat()
   {

      cout<<"B::eat()"<<endl;

   }

};

class C: public A
{

   public:
   void eat()

   {

      cout<<"C::eat()"<<endl;

   }

};

class D: public B, C
{

};

int foo(A *ptr)
{

ptr->eat();

}
main()
{

D obj;
foo(&(obj.B)); //error. How do i call with D's B part.

}

La llamada foo anterior es un error de tiempo de compilación. Quiero llamar a foo con la parte B de obj sin usar herencia virtual. Cómo puedo hacer eso.

Además, en caso de herencia virtual, por qué la información de compensación debe almacenarse en la tabla vtable. Esto se puede determinar en el momento de la compilación. En el caso anterior, si pasamos foo con el objeto de D, solo en tiempo de compilación podemos calcular el desplazamiento de la parte A de D.

Respuestas a la pregunta(4)

Su respuesta a la pregunta