Zugriff auf vererbte Variablen



  • Hallo,

    ich stehe momentan vor dem Problem, dass ich mehrere vererbte Klassen habe und nun gerne auf Variablen der vererbten Klassen zugreifen würde. Hier erstmal zum Verständnis die Klassen.

    class a
    {
    public:
    	virtual void show()
    	{
    		return;
    	}
    };
    
    class b: public a
    {
    public:
    	String name;
    	b(String &nname) { name = nname; }
    	virtual void show() { ShowMessage(name); }
    };
    

    Das wären zwei Testklassen. Nun erzeuge ich ein paar b's und speichere sie in einen a Vector.

    vector<a*> v;
    
    String temp = "lala";
    b *new_b = new b(temp);
    v.push_back(new_b);
    

    Mit

    v[0]->show();
    

    könnte ich mir jetzt den Namen des ersten b's ausgeben lassen. Doch wie komme ich an 'name' dran um es zu ändern? Ich könnte bei a noch ein

    virtual void setname(String nname)
    {
    	return;
    }
    

    und bei b ein

    virtual void setname(String nname)
    {
    	name = nname;
    }
    

    einbauen. Bei einer Variable ist das auch kein Problem. Doch bei vielen Variablen erscheint mir das nicht sinnvoll und ich kann auch nicht auf Funktionen der Variablen zugreifen. (name.xxx)

    Wie komme ich an meine Variablen dran? Wenn ich sie per ->*variable* anspreche, bekomme ich logischerweise den Fehler, dass *variable* kein Element von a ist. Ich habe versucht mit reinterpret_cast etc aus dem a dynamisch ein b zu machen, aber weitergekommen bin ich damit nicht.

    Kann mir jemand sagen, wie ich an meine Variablen drankomme?

    greetz KN4CK3R



  • folgendes: wenn deine Klasse a keine Methode anbietet, auf eine Variable zuzugreifen, kommst du da mit einem normalen Zeiger auf a auch nicht dran.

    Wenn du sowas brauchst, solltest du dich zuerst einmal fragen: Warum brauchst du Zugriff auf Variablen von Kindklassen, wenn du über einen Basiszeiger darauf zugreifst? Das deutet doch stark auf einen Designfehler hin.

    Was ist, wenn du eine dritte Klasse c von a ableitest, die dann aber keine variable name hat und du versuchst über einen zeiger a* den namen der Klasse c zu ändern, obwohl es doch gar kein b ist und keinen namen hat?

    Wenn du spezifisches Verhalten von b benötigst, solltest du auch über einen Zeiger auf b darauf zugreifen, welche du dir aber nicht in einem allgemeinen vector speichern solltest.



  • Die Idee hinter dem ganzen war, dass, da alle abgeleiteten Klassen eine einheitliche Funktion haben, ich durch den großen Vector mit allen Elementen in einer Schleife diese Funktion aufrufen kann. Sonst bräuchte ich für alle 10 Vektoren jeweils eine Schleife. Da erschien mir die eine Schleife praktischer. Dass ich nicht bei c auf name zugreifen kann, ist mir auch klar. Da müsste logischerweise aufgepasst werden, dass nur dann auf name zugegriffen wird, wenn das ausgewählte Object auch ein b ist.

    greetz KN4CK3R



  • KN4CK3R schrieb:

    Die Idee hinter dem ganzen war, dass, da alle abgeleiteten Klassen eine einheitliche Funktion haben,...

    Es ist nur sinnvoll über Basisklassen zuzugreifen wenn die Schnittstelle für die Zugriffe komplett identisch sind. Nur deshalb eine Basisklasse zu schreiben um Äpfel und Elefanten in einen gemeinsamen Container zu werfen, führt am Schluss nur zu Apfelbrei mit Fleischzulage...



  • also nochance und wieder back to the roots?

    Edit: kurz Frage zu Borland. Dort ist ein Editfeld ja zB auch vererbt von einigen Sachen und trotzdem kann man dort mit Edit->Text = "lala"; die Variable Text verändern. Wie funktioniert das denn dann da?

    greetz KN4CK3R



  • KN4CK3R schrieb:

    Edit: kurz Frage zu Borland. Dort ist ein Editfeld ja zB auch vererbt von einigen Sachen und trotzdem kann man dort mit Edit->Text = "lala"; die Variable Text verändern. Wie funktioniert das denn dann da?

    Ja, aber dort greifst du auf den Typ zu, nicht wie hier über die Basisklasse (Oder aber Text ist in einer Basisklasse definiert). Du wiederum willst wiederum auf die Eigenschaften der abgeleiteten Klasse von der Basisklasse aus zugreifen. Dies geht nicht ohne weiteres und ist meist auch nicht sinnvoll (In einigen Ausnahmefällen verwendet man sowas wie dynamic_cast, dies sollte aber die Ausnahme nicht die Regel sein).



  • stimmt, hat ich grad nicht bedacht, dass das ja nur die abgeleitete Klasse ist. Damit ist dann alles geklärt, danke.

    greetz KN4CK3R



  • asc schrieb:

    Ja, aber dort greifst du auf den Typ zu, nicht wie hier über die Basisklasse (Oder aber Text ist in einer Basisklasse definiert).

    In diesem speziellen Fall ist Text eine Property, d.h. der Zugriff erfolgt über Funktionen, und diese ist in einer Basisklasse deklariert.



  • ok, danke für die Info. Werde es dann wieder so umbauen, wie es anfänglich schon war.

    greetz KN4CK3R


Log in to reply