Kann ein Parent wissen, von welchem Child er aktuell benutzt wird?



  • Ich habe hier ein rein logisches Problem, habe aber zuwenig Erfahrung mit Objekt-Orientierung. Und zwar habe ich 3 Klassen:

    Klasse A: Instanziiert Klasse B
    Klasse B: Stammt von Klasse C ab
    Klasse C: Eine Klasse mit vielen Standardmethoden

    Die Klasse B stammt also von C ab, weil sie neben den C-typischen Methoden auch spezielle eigene Methoden besitzt. Jetzt habe ich das Problem, dass Klasse C eine Methode XYZ verwendet, die Klasse B besitzt, weil sie von mal zu mal unterschiedlich ist. So würde eine Klasse D, die auch von C abstammt, eine noch andere Version dieser Methode XYZ haben.

    Wie bringe ich C nun bei, dass es die Methode XYZ von z.B. B benutzen soll und ein anderes mal von D? Gibt es sowas (nur hypothetisch) wie child->XYZ() ?



  • - streichen -



  • Klasse C weiss aber nicht, ob es B::XYZ oder D:XYZ aufrufen soll. Es muss wissen, wer sein aktueller Child ist.





  • Also, so wie ich das verstanden habe, dürfte das - als Code - bei dir so aussehen:

    #include <iostream>
    
    // ## Basisklasse C ############################################################
    class C
    {
    public:
        void verwendeMethode() { /* B::XYZ() oder D::XYZ? */ }
    private:
    
    };
    
    // ## Abgeleitete Klassen B und D ##############################################
    class B : public C
    {
    public:
        void XYZ() { std::cout << "Klasse B\n"; }
    private:
    
    };
    
    class D : public C
    {
    public:
        void XYZ() { std::cout << "Klasse D\n"; }
    private:
    
    };
    
    // ## unwichtig für das Beispiel ###############################################
    class A
    {
    public:
        B einB;
    private:
    
    };
    
    // ## main: Hauptprogramm ######################################################
    int main()
    {
    
        return 0;
    }
    

    Die Lösung ist, wie Erhart Enkes bereits angedeutet hat, folgendes:

    #include <iostream>
    
    // ## Basisklasse C ############################################################
    class C
    {
    public:
        C* child;
        virtual void XYZ() { std::cout << "Klasse C\n"; }
        void verwendeMethode() { child->XYZ(); }
    private:
    
    };
    
    // ## Abgeleitete Klassen B und D ##############################################
    class B : public C
    {
    public:
        void XYZ() { std::cout << "Klasse B\n"; }
    private:
    
    };
    
    class D : public C
    {
    public:
        void XYZ() { std::cout << "Klasse D\n"; }
    private:
    
    };
    
    // ## main: Hauptprogramm ######################################################
    int main()
    {
        C einC;
    
        einC.child = new B;
        einC.verwendeMethode();
        delete einC.child;
    
        einC.child = new D;
        einC.verwendeMethode();
        delete einC.child;
    
        std::cin.get();
    
        return 0;
    }
    

    Hier kommt die Polymorphie zum Einsatz. Mithilfe von Zeigern und einer virtuellen Tabelle (sog. vtable) kann die Basisklasse zur Laufzeit ermitteln, welche Methode die richtige ist und aufgerufen werden soll.



  • Perfekt, das ist die Lösung, danke 🙂


Anmelden zum Antworten