virtuelle Methodentabelle für Mehrfachvererbung
Ich lese diesen Artikel "Virtuelle Methodentabelle"
Beispiel im obigen Artikel:
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();
In dem Artikel stellt der Autor vor, dass das Speicherlayout von Objektd
ich mag das
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()
Die Frage ist überd->f2()
. Der Aufruf and->f2()
übergibt einB2
Zeiger alsthis
Zeiger also müssen wir etwas tun wie:
(*(*(d[+8]/*pointer to virtual method table of D (for B2)*/)[0]))(d+8) /* Call d->f2() */
Warum sollten wir ein @ übergebB2
Zeiger alsthis
Zeiger nicht das OriginalD
Zeiger ??? Wir rufen tatsächlich D :: f2 () auf. Nach meinem Verständnis sollten wir ein @ übergebD
Zeiger alsthis
bis D :: f2 () Funktion.
___aktualisieren___
Wenn Sie ein @ übergebB2
Zeiger alsthis
bis D :: f2 (), Was ist, wenn wir auf die Mitglieder von @ zugreifen wolleB1
Klasse in D :: f2 () ?? Ich glaube dasB2
er Zeiger @ (this) wird folgendermaßen angezeigt:
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
It hat bereits einen bestimmten Versatz der Anfangsadresse dieses zusammenhängenden Speicherlayouts. Zum Beispiel möchten wir auf @ zugreifb1
in D :: f2 (), ich denke, in der Laufzeit wird es so etwas wie tun:*(this+4)
(this
zeigt auf dieselbe Adresse wie b2), die auf @ zeigen würb2
imB
????