Pointer auf abgeleitete Klassen



  • Hallo zusammen,

    ich hoffe meine Frage ist nicht allzu unqualifiziert. Ich habe folgendes prinzipielles Problem:

    BasisKlasse{
    //hier gibts einige Methoden und Konstruktoren
    };

    AbgeleiteteKlasse : public BasisKlasse{
    Typ eineMethode();
    };

    Irgendwo im Code möchte ich von "AbgeleiteteKlasse" Gebrauch machen. Also:
    BasisKlasse *b = new AbgeleiteteKlasse();

    Nun möchte ich *b natürlich als "BasisKlasse" verwenden, und bei bedarf auf die zusätzliche Funktionalität in "AbgeleiteteKlasse" verfügen, z.B.:
    b->eineMethode();

    Wieso funktioniert sowas nicht?



  • Polymorphie hilft dir bei "Rufe die richtige Methode auf", nicht bei "Rufe eine Methode die nur in der abgeleiteten Klasse existiert auf"!

    class Base
    {
        virtual void foo ();
    };
    
    class Derived1 : public Base
    {
        virtual void foo () { cout << "Derived1" << endl; }
    };
    
    class Derived2 : public Base
    {
        virtual void foo () { cout << "Derived2" << endl; }
    };
    
    ...
    
    Base* base = new Derived1();
    base->foo(); // Derived1::foo()
    

    Aber die Methode muss zumindest im abstrakten Zustand schon in der Basisklasse vorhanden sein.

    MfG SideWinder



  • Danke für die schnelle Antwort! Wenn ich die Methode als "virtual" in der BasisKlasse vordeklariere, dann klappt's 🙂 Ist dies die einzige Möglichkeit? Die Basisklasse könnte ja schon "fertig" sein, und man möchte nur noch zusätzlich was hinzufügen, ohne die Basisklasse zu verändern.

    MfG



  • Du kannst natürlich auch etwas in der abgeleiteten Klasse hinzufügen (meistens der Sinn von abgeleiteten Klassen). Diese zusätzliche Funktionalität ist dann aber nicht über einen Basisklassen-Zeiger aufrufbar (woher soll der auch davon wissen).

    Bist du dir also sicher ein Derived1-Objekt zu besitzen kannst du einen Cast durchführen (Stichwort: dynamic_cast) und den Basisklassen-Zeiger auf einen Derived1-Zeiger casten. Dann sind abgeleitete Funktionen ebenfalls aufrufbar. Natürlich hat das dann nichts mehr mit Polymorphie zu tun.

    MfG SideWinder



  • Ich habe mir mal dynamic_cast angeschaut und damit klappt's wunderbar!

    Danke!

    MfG


Anmelden zum Antworten