Frage

In C-Struktur ist, ich bin garantiert, dass:

struct Foo { ... };
struct Bar {
  Foo foo;
  ...
}
Bar bar;
assert(&bar == &(bar.foo));

Nun, in C ++, wenn ich:

class Foo { ... };
class Bar: public Foo, public Other crap ... {
  ...
}

Bar bar;
assert(&bar == (Foo*) (&bar)); // is this guaranteed?

Wenn ja, können Sie mir eine Referenz (wie "The C ++ Programming Language, Seite xyz")?

Danke!

War es hilfreich?

Lösung

Es gibt keine Garantie. Aus dem C ++ 03-Standard (10/3, class.derived):

  

Die Reihenfolge, in der die Basisklasse Subobjekte in dem die meisten abgeleitetes Objekt zugeordnet sind, (1.8) ist nicht spezifiziert.

Andere Tipps

Auch wenn das Layout für Basisklassen ist garantiert nicht in der Art und Weise Sie scheinen gedacht zu haben (und auch wenn es mehr Garantien für die Mitglieder sind), ist dies garantiert:

Bar bar;
assert(&bar == (Foo*) (&bar));

Weil das gegossene verwendet eine static_cast (pro 5,4), die &bar korrekt konvertiert werden, und der Vergleich zwischen pointer-to-Base und pointer-to-derived konvertiert in ähnlicher Weise.

Dies würde jedoch nicht garantiert werden:

Bar bar;
void* p1 = &bar;
void* p2 = (Foo*)&bar;
assert(p1 == p2); // not guaranteed

Ich kann mir nicht vorstellen, es wäre, ich weiß nicht, warum es sein müßte.

Ich habe eine ähnliche Frage.

Wenn Sie Diamant Vererbung haben:

class Base(){ virtual void AFunc(){}  };

class A:Base{};
class B:Base{void AFunc(){} }

class Test:A,B{};


Base * b = (Base*)new Test;

b->AFunc();

lässt, dass die Speicherstruktur annehmen, ist Basis: A: B: Test,

Notiz an der Stelle des Aufrufs, alle die Compiler wissen, ist die Adresse des Beginns des Objekts und AFunc erwartet zu Beginn des B Objekts relativ zu sein, diese beiden Adressen werden nicht gleich sein! so wie funktioniert es?

wie wenn b vom Typ B ist, die beiden Adressen wären das gleiche ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top