Organisation der Variablen im Speicher bei Vererbung



  • Hallo zusammen,

    struct Bar
    {
    	int x;
    	int y;
    };
    
    class Foo : public Bar
    {
    	int z;
    };
    

    Ist hier garantiert das die Variablen x und y im Speicher vor der Variable z liegen?

    Ich wollte nämlich im Foo-Konstruktor mit memset die Bar-Membervariablen auf 0 setzen.

    memset(this, 0, sizeof(Bar));
    

    Jetzt wollte ich mir sicher gehen, das dabei keine Variablen von der Klasse Foo überschrieben werden (die ich über die Initialisierungsliste initialisiere, also vor dem memset).

    Die Bar-Struktur ist vorgegeben und dort kann ich keinen Konstruktor einfügen.



  • Ich weiß jetzt zwar nicht was du genau vor hast, aber ich schätze Vererbung ist hier fehl am Platz. Gib der Foo-Klasse lieber Bar als Member.



  • Ist hier garantiert das die Variablen x und y im Speicher vor der Variable z liegen?

    Nein. Die Reihenfolge von Membern ist innerhalb *einer* Klasse immer nur innerhalb *eines* Access-Levels vorgeschrieben.

    Ich wollte nämlich im Foo-Konstruktor mit memset die Bar-Membervariablen auf 0 setzen.

    Keine gute Idee.



  • würde das eigentlich funktionieren:

    Foo::Foo()
      : z(0)
    { memset(static_cast<Bar*>(this), 0, sizeof(Bar)); }
    

    ?
    Schließlich ist das Bar-Subobjekt ein POD.


Anmelden zum Antworten