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 dasB2er 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 ????