Fragen zu abgeleiteten Klassen



  • Hi

    Ich habe eine Basisklasse von dieser mehrere andere Klassen abgeleitet (sagen wir SubKlasse1-3). Diese Subklassen haben jetzt alle eine Funktion die die Basisklasse nicht hat.

    Jetzt habe ich ein Array:

    Basisklasse test_array[3];

    test_array[0]=SubKlasse1;
    test_array[1]=SubKlasse2;
    test_array[2]=SubKlasse3;

    Wie rufe ich jetzt über das Array die Funktion der Subklasse auf, die die Basisklasse noch nicht hat? (Die Basisklasse darf nicht abstrakt werden)

    Kann mir da wer weiterhelfen?

    MfG

    Faultier



  • So, wie du das gezeigt hast, geht das nicht.

    Das Verhalten nennt sich (Laufzeit-)Polymorphie und funktioniert nur mit Zeigern oder Referenzen. Damit man in den abgeleiteten Klassen eine Funktion aufrufen kann, wenn man nur Zeiger oder Referenzen vom Typ einer Basisklasse hat, muss man die Funktionen virtuell machen.

    class Base
    {
        public:
            virtual void Foo() = 0; // rein virtuell
    };
    
    class Derived1 : public Base
    {
        public:
            virtual void Foo()
            {
                std::cout << "Derived1" << std::endl;
            }
    };
    
    class Derived2 : public Base
    {
        public:
            virtual void Foo()
            {
                std::cout << "Derived2" << std::endl;
            }
    };
    
    Base* Array[3] = {new Derived1, new Derived2, new Derived1};
    Array[0]->Foo();
    Array[1]->Foo();
    Array[2]->Foo();
    

    Hier wird dann automatisch die richtige Funktion aufgerufen ( delete s nachher nicht vergessen...).

    So hast du die Basisklasse aber abstrakt, weil dort eine rein virtuelle (nicht definierte) Funktion vorkommt. Ansonsten musst du die Funktion implementieren - aber wieso willst du keine abstrakte Basisklasse, wenn du sowieso nur auf Instanzen der abgeleiteten Klassen zugreifst?



  • Die Basisklasse wird an anderer Stelle noch Instantiiert. Und das "an anderer Stelle" ist nicht mein Code. Da will ich meinen Kollegen jetzt nicht ins Handwerk pfuschen...

    Kann man das ganze auch irgendwie mit umcasten regeln?

    MfG

    Faultier



  • Implementier doch einfach die Funktion in der Basisklasse, meinetwegen als nichts-tuende Funktion.

    Ja, es gäbe noch dynamic_cast , aber das ist eher unschön, da du Fälle unterscheiden oder alle abgeleiteten Klassen durchprobieren musst.


Anmelden zum Antworten