Virtuelle Tabellen und Speicher-layout in mehrere virtuelle Vererbung

Betrachten folgende Hierarchie:

struct A {
   int a; 
   A() { f(0); }
   A(int i) { f(i); }
   virtual void f(int i) { cout << i; }
};
struct B1 : virtual A {
   int b1;
   B1(int i) : A(i) { f(i); }
   virtual void f(int i) { cout << i+10; }
};
struct B2 : virtual A {
   int b2;
   B2(int i) : A(i) { f(i); }
   virtual void f(int i) { cout << i+20; }
};
struct C : B1, virtual B2 {
   int c;
   C() : B1(6),B2(3),A(1){}
   virtual void f(int i) { cout << i+30; }
};
  1. Was ist der genaue Speicher-layout von C Instanz? Wie viele vptrs es enthält, wo genau jeder von Ihnen platziert wird? Die virtuellen Tabellen werden gemeinsam mit der virtuellen Tabelle der C? Was genau die einzelnen virtuellen Tabelle enthält?

    Hier, wie ich verstehe, layout:

    ----------------------------------------------------------------
    |vptr1 | AptrOfB1 | b1 | B2ptr | c | vptr2 | AptrOfB2 | b2 | a |
    ----------------------------------------------------------------

    wo AptrOfBx ist der Zeiger auf A Instanz, die Bx enthält (da die Vererbung virtuell ist).

    Ist das richtig? Welche Funktionen vptr1 Punkte zu? Welche Funktionen vptr2 Punkte zu?

  2. Angesichts des folgenden code

    C* c = new C();
    dynamic_cast<B1*>(c)->f(3);
    static_cast<B2*>(c)->f(3);
    reinterpret_cast<B2*>(c)->f(3);

    Warum die alle Aufrufe f drucken 33?

  • Ist diese Hausaufgaben, oder Neugier?
  • Eigentlich ist das Examen. Aber ich bin mir sicher, wenn ich endlich verstehen, wie die Dinge funktioniert in diesem Beispiel, kann ich alles verstehen, die Bezug auf Mehrfachvererbung und virtuelle Vererbung.
  • Sie können leicht herausfinden, die zu Beginn jedes Elternteil Unterobjekt wie diese: C foo; intptr_t offsetB1 = (intptr_t)(B1*)&foo - (intptr_t)&foo;, die beginnt von den anderen Basen abgeleitet werden können, entsprechend. Auch zur Berechnung der sizeof aller Klassen sollte Ihnen ein weiterer guter Anhaltspunkt.
InformationsquelleAutor JeB | 2012-07-22
Schreibe einen Kommentar