Usted puede imaginar este código:
struct A {
void f() {}
int int_in_b1;
};
int main() {
A a;
a.f();
return 0;
}
está transformando en algo así como:
struct A {
int int_in_b1;
};
void A__f(A* const this) {}
int main() {
A a;
A__f(&a);
return 0;
}
Calling f es directo porque no es virtual. (Y a veces para las llamadas virtuales, el envío virtual se puede evitar si se conoce el tipo dinámico del objeto, como está aquí.)
Un ejemplo ya que, o bien darle una idea acerca de cómo funciona el trabajo virtual o terriblemente se confunden:
struct B {
virtual void foo() { puts(__func__); }
};
struct D : B {
virtual void foo() { puts(__func__); }
};
int main() {
B* a[] = { new B(), new D() };
a[0]->foo();
a[1]->foo();
return 0;
}
ser algo así como:
void B_foo(void) { puts(__func__); }
void D_foo(void) { puts(__func__); }
struct B_VT {
void (*foo)(void);
}
B_vtable = { B_foo },
D_vtable = { D_foo };
typedef struct B {
struct B_VT* vt;
} B;
B* new_B(void) {
B* p = malloc(sizeof(B));
p->vt = &B_vtable;
return p;
}
typedef struct D {
struct B_VT* vt;
} D;
D* new_D(void) {
D* p = malloc(sizeof(D));
p->vt = &D_vtable;
return p;
}
int main() {
B* a[] = {new_B(), new_D()};
a[0]->vt->foo();
a[1]->vt->foo();
return 0;
}
Cada objeto tiene solamente un puntero vtable y puede agregar muchos métodos virtuales a la clase sin afectar el tamaño del objeto. (El vtable crece, pero se almacena una vez por clase y no tiene una sobrecarga de tamaño significativa.) Tenga en cuenta que simplifiqué muchos detalles en este ejemplo, pero does work: los destructores no están direccionados (que también deberían ser virtuales aquí), pierde la memoria, y los valores __func__ serán ligeramente diferentes (son generados por el compilador para el nombre de la función actual), entre otros.
Recomiendo 'Dentro del Modelo de Objetos C++' de Stanley Lippman si quiere cómo se pueden modelar objetos C++ (digo que puedo porque hay múltiples formas de implementar C++ internos). –
Si corrige su código, ¿por qué no ejecuta su compilador con salida de ensamblador y ve lo que genera? –