Probleme mit Vererbung !



  • Hallo zusammen, kann sich mal jemand diesen Code ansehen ?!
    Gibt es eine Möglichkeit, dass das sizeof im Konstruktor der Klasse Object den Typ der abgeleiteten Instanz richtig berechnet ??

    #include <iostream>
    
    using namespace std;
    
    // *****************************************
    class Object{
    private:
        static unsigned long mem_alloc;
        int a,b,c;
    public:
        Object(void){
            Object::mem_alloc += sizeof(*this);
        }
        ~Object(void){
            Object::mem_alloc -= sizeof(*this);
        }
    
        static unsigned long getMem(void){
            return Object::mem_alloc;
        }
    
        unsigned long getSize(void){
            return sizeof(*this);
        }
    };
    
    unsigned long Object::mem_alloc = 0;
    
    class Sprite:public Object{
    private:
        int d,e,f;
    public:
        Sprite(void):Object(){
        }
        ~Sprite(void){
        }
    };
    // *****************************************
    
    int main(void){
        Sprite *pObj = new Sprite[3];
    
        cout << "Extern: " << sizeof(pObj[0]) << endl;
        cout << "Intern: " << pObj[0].getSize() << endl;
        cout << "Memory: " << Object::getMem() << endl;
    
        delete []pObj;
    
        !Object::getMem() ? cout << "Checksum: OK" : cout << "Cheksum: FAILED (Memory issue: " << Object::getMem() << " Bytes)";
    
        cout << endl << endl << endl << endl;
        return 0;
    }
    


  • Gibt es eine Möglichkeit, dass das sizeof im Konstruktor der Klasse Object den Typ der abgeleiteten Instanz richtig berechnet ??

    Nein. Da es zu diesem Punkt überhaupt noch kein Objekt gibt! Das Leben eines Objekts beginnt erst nachdem der Ctor *komplett* gelaufen ist.
    Innerhalb des Object-Ctor wird das Objekt erst gebastelt. Falls du ein Sprite-Objekt anlegst, wird hier gerade erst der Object-Teil erstellt. Von diesem kannst du die Größe bestimmen. Zu diesem Zeitpunkt gibt es aber noch kein Sprite-Objekt.

    Genausowenig wie es innerhalb von Ctoren späte Bindung gibt (virtuelle Methoden werden hier immer statisch aufgelöst), kannst du im Ctor einer Basisklasse die endgültige Größe des möglicherweise abgeleiteten Objekts bestimmen.


Anmelden zum Antworten