Problem mit dynamischen Klassen und Vererbung...



  • Hallo,
    ich hab ein großes Problem, was Vererbung angeht.
    Ich habe ene Klasse, die von einer anderen Klasse abgeleitet wird und
    eine Funktion, die als rückgabewert den zeiger auf ein objekt einer
    basisklasse hat.
    also so:

    class Class1
    {
       [...]
    };
    
    class Class2
       : public Class1
    {
       [...]
    };
    
    Class1* FuncGetClassObject();
    

    Weiß jemand vielleicht, ob ich ein Objekt von Class2 erstellen kann
    und damit der Basisklasse automatisch das Ergebnis meiner Funktion
    zuweisen kann? Sodass Class2 mit ausgefüllter Basisklasse erstellt wird?
    Hoffe ich habs nicht zu umständlich beschrieben.

    Danke schonmal,
    Norman



  • Norman0406 schrieb:

    Hoffe ich habs nicht zu umständlich beschrieben.

    Ich fürchte genau das ist der Fall. (Außer du meinst Class1* foo = new Class2 (probier's einfach aus, funktioniert.))

    Wie wär's mit einer Pseudocode-Implemantation von FuncGetClassObject?



  • also prinzipiell sieht meine funktion so aus:

    Class1* FuncGetClassObject()
    {
       Class1* newObject = new Class1;
       [...] // Hier wird das Objekt dann initialisiert und in eine vector-liste geschrieben
    
       return newObject;
    }
    

    Das return am Ende mache ich nur, falls ich doch noch irgendwas mit dem
    Objekt machen möchte und keine Lust hab, nochmal die Liste danach zu
    durchsuchen.
    Aber ich wollte gerne das erstelle Objekt (newObject) als Basisobjekt für
    meine Class2 haben, also irgendetwas in der Richtung:

    Class2* pClass2 = new Class2;
    pClass2::Class1 = FuncGetClassObject();
    

    Ich weiß, das ist schrecklich falsch, vor allem weil ich den mit 'new' für das
    Basisobjekt reservierten Speicher verloren hätte und nicht mehr löschen könnte,
    aber es wär halt toll 😉

    Das mit

    Class1* foo = new Class2;
    

    klappt bei mir nicht, er sagt immer, ich könne Class2 nicht in Class1 casten.

    Ich habs jetzt einfach mal so gelöst, dass ich auf Vererbung verzichte und
    jetzt sieht meine Class2 so aus:

    class Class2
    {
       [...]
       Class1* m_pClass1;
       void SetClass(Class1* pClass) { m_pClass1 = pClass; };
    };
    

    Ist vielleicht nicht so elegant wie Vererbung, aber jetzt klappts.
    Aber danke nochmal.



  • Also wenn

    Class1* foo = new Class2;
    

    bei dir nicht klappt, dann hast du etwas mit der Vererbung falsch gemacht.
    Verwende in der Basisklasse aber auf jeden Fall einen virtuellen Destruktor:

    class Class1
    {
    public:
      virtual ~Class1() {};
    };
    

    Die zweite Variante ist auf jeden Fall nicht so toll, da du dann den Zeiger ja irgendwo wieder freigeben müßtest.


Anmelden zum Antworten