tabla de método virtual para herencia múltiple
Estoy leyendo este artículo "Tabla de métodos virtuales"
Ejemplo en el artículo anterior:
class B1 {
public:
void f0() {}
virtual void f1() {}
int int_in_b1;
};
class B2 {
public:
virtual void f2() {}
int int_in_b2;
};
class D : public B1, public B2 {
public:
void d() {}
void f2() {} // override B2::f2()
int int_in_d;
};
B2 *b2 = new B2();
D *d = new D();
En el artículo, el autor introduce que la disposición de la memoria del objetod
es así:
d:
D* d--> +0: pointer to virtual method table of D (for B1)
+4: value of int_in_b1
B2* b2--> +8: pointer to virtual method table of D (for B2)
+12: value of int_in_b2
+16: value of int_in_d
Total size: 20 Bytes.
virtual method table of D (for B1):
+0: B1::f1() // B1::f1() is not overridden
virtual method table of D (for B2):
+0: D::f2() // B2::f2() is overridden by D::f2()
La pregunta es sobred->f2()
. La llamada ad->f2()
pasa unB2
puntero como unthis
puntero, así que tenemos que hacer algo como:
(*(*(d[+8]/*pointer to virtual method table of D (for B2)*/)[0]))(d+8) /* Call d->f2() */
¿Por qué deberíamos pasar unB2
puntero como elthis
puntero no el originalD
¿¿¿puntero??? En realidad estamos llamando a D :: f2 (). Según mi entendimiento, deberíamos aprobar unD
puntero comothis
a la función D :: f2 ().
___actualizar____
Si pasa unB2
puntero comothis
a D :: f2 (), ¿Qué pasa si queremos acceder a los miembros deB1
clase en D :: f2 () ?? Creo que elB2
El puntero (esto) se muestra así:
d:
D* d--> +0: pointer to virtual method table of D (for B1)
+4: value of int_in_b1
B2* b2--> +8: pointer to virtual method table of D (for B2)
+12: value of int_in_b2
+16: value of int_in_d
Ya tiene un cierto desplazamiento de la dirección inicial de este diseño de memoria contigua. Por ejemplo, queremos accederb1
dentro de D :: f2 (), supongo que en tiempo de ejecución, hará algo como:*(this+4)
(this
apunta a la misma dirección que b2) que apuntaríab2
enB
????