arrays und vererbung



  • folgende Frage beschäftigte mich diese nacht:

    class eins 
    {
    };
    class zwei: eins
    {
    };
    class drei : eins
    {
    };
    
    main ()
    {
    eins feld[100];
    zwei test1;
    drei test2;
    //geht folgendes:
    feld [1] = test1;
    feld [2] = test2;
    }
    

    und zusätzlich die Frage: (habe schon etwas gegooglet und bin nur auf lange Texte gestoßen) kann man während des Laufes die größe einer Array ändern?
    und zum meinem Beispiel, wäre eine Liste sinnvoller? wenn ja wieso?

    liebe Grüße



  • Ja, es ist möglich, macht aber wahrscheinlich nicht das, was du möchtest. Du kannst nämlich auch folgendes machen

    class eins
    {
    };
    
    //Ich nehme an, du meintest public-Vererbung
    class zwei: public eins
    {
    };
    
    int main ()
    {
        eins foo;
        zwei bar;
        foo = bar;
    }
    

    Das geht deshalb, weil public-Vererbung "ist ein" bedeutet, das heißt jedes Objekt der abgeleiteten Klasse "ist" auch ein Objekt der Basisklasse, bzw. kann implizit in eins konvertiert werden. Das ist auch genau das, was hier passiert. bar wird als Objekt der Klasse eins interpretiert und nur dieser Anteil wird dann in das Objekt foo kopiert. Das nennt man Slicing, weil dabei die zusätzlichen Eigenschaften der abgeleiteten Klasse verloren gehen.

    Was du wahrscheinlich lieber haben würdest, wäre ein Array (oder eine Liste, siehe unten) von Zeiger auf Objekte der Basisklasse. Dann kann nämlich auch (die Adresse) von Objekten der abgeleiteten Klasse darin gespeichert werden und (zum Beispiel durch virtuelle Methoden) können immer noch die Eigenschaften der abgeleiteten Klasse verwendet werden.

    Zu der Frage mit dem Array: Zur Laufzeit kannst du die Größe eines Arrays nicht ändern (außer indem du ein neues anlegst und dann die Daten rüberkopierst). Du kannst aber std::list oder std::vector benutzen, je nachdem, was für deine Zwecke besser geeignet ist.

    std::vector ist mehr wie ein Array, dessen Größe sich zur Laufzeit verändern kann, das heißt, man kann unter anderem den Index-operator wie bei Arrays verwenden. Bei Listen kann man dagegen besser einfügen und löschen, hat dafür aber keinen random access (das heißt keinen Indexoperator).

    Felix


Anmelden zum Antworten