Zugriff von Oberklasse in Unterklasse



  • Hallo,

    wir schreiben grad ein Projekt und haben eine Oberklasse + Unterklasse
    (Unterklasse ist Ableitung von Oberklasse)

    Ich weiß das ich von der Unterklasse auf alles in der Oberklasse Zugriff hab das public ist oder protected.

    Aber gibt es eine Möglichkeit von der Oberklasse in die Unterklasse zu kommen ?

    Mein Vorschlag wäre eine class temp zu erstellen mit public: Datentypen.
    temp Klasse ist eigene Klasse und hat nichts mit Ober oder Unterklasse zu tun.

    von Unterklasse wird dann in temp Klasse geschrieben und von temp Klasse in Oberklasse.

    Mit einer Zeichnung wäre es bestimmt besser zu erklären.
    Weiß jemand einen besseren Rat ???
    Ich weiß selbst das des ned so toll ist aber etwas besseres fällt mir ned ein...

    Danke schon mal für eure Vorschläge



  • Hier steht mal wieder (wie so oft) die Frage im Raum, was du damit erreichen willst.

    Eine Vererbung ist immer eine ist ein(e)-Beziehung. Daraus folgt, dass eine abgeleitete Klasse alle Eigenschaften (Attribute) und Fähigkeiten (Methoden) besitzt, welche sie von der Vaterklasse geerbt hat. Ausnahmen sind hier die privaten Elemente, da diese für die innere Konsistenz der Vaterklasse nötig sind - streng genommen kann/sollte man protected Elemente ganz vermeiden, wenn man die Kapselung rigoros durchführen will.

    Eine Vaterklasse kann nach dem Schema überhaupt keinen Zugriff auf die Elemente der abgeleiteten Klasse haben (außer diejenigen, sie selbst vererbt hat). Hier fehlt die ist ein(e) Beziehung. Zumal kann die Vaterklasse niemals wissen, welche Ableitungen vorgenommen wurden.

    Fazit: Klassendesign überdenken oder genauer deinen Anwendungsfall schildern 😉

    Grüße... Heiko



  • es geht mit pure virtual methoden

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Oberklasse
    {
    public:
        virtual ~Oberklasse() {}
    
    	void greifeAufUnterklasseZu()
    	{
    	    cout << "Die Oberklasse weiss, dass die Unterklasse " << zeigeName() << " heisst.\n";
    	}
    
    protected:
    	virtual string zeigeName() = 0;
    };
    
    class Unterklasse : public Oberklasse
    {
        virtual ~Unterklasse() {}
    
    protected:
    	virtual string zeigeName()
    	{
    	    return "Rumpelstilzchen";
    	}
    };
    
    int main()
    {
    	Oberklasse *test = new Unterklasse;
    	test->greifeAufUnterklasseZu();
    
    	//der speicher der unterklasse wird auch durch das delete freigegeben,
    	//da der oberklasse-destruktor virtual ist: virtual ~Oberklasse() {}
    	delete test;
    }
    


  • der destruktor von unterklasse sollte natürlich auch public sein 🤡
    normale virtual methoden gehen natürlich auch, wenn man nicht erzwingen will, dass die unterklasse daten liefert und ein direktes erstellen der oberklasse ermöglichen will.



  • Danke @rumpelstilzchen hat mir sehr geholfen...


Anmelden zum Antworten