Vererbung
-
ich habe folgendes Kontrukt:
eine klasse basiseine davon abgeleitete klasse kind
die klasse kind soll nun eine method foo() haben, die in der basis noch nicht vorhanden war
nun existiert ein vector<basis*>
in den basen und kinder reingesteckt werden können
wie kann ich nun aber die funktion foo() aufrufen?
und wie kann ich sichergehen dass beim abruf auch tatsächlich die methode foo() existiert?ich möchte eigentlich keine abstrakte basisklasse entickeln, die alle funktionen irgendwie beinhaltet
später muss es nämlich noch andere kinder_i geben, die zwar auch im prinzip von basis abstammen aber nichts untereinander gemeinsam haben
ist vlt die wahl von vector schlecht?
-
Warum soll basis diese Funktion (abstrakt) denn nicht enthalten?
Du kannst zwar theoretisch mittels dynamic_cast basis* auf kind* casten und durch Überprüfung des Zeigers testen ob das alles funktioniert. Das widerspricht aber etwas dem Sinn der Polymorphie.
-
-anfänger schrieb:
ist vlt die wahl von vector schlecht?
Nein, was schlecht ist, ist das Vererbungsdesign. Wenn du polymorphes Verhalten willst, besteht zwischen den Klassen eine Verhält-Sich-Genau-Wie-Ein-Beziehung. Die üblich genannt Ist-Ein-Beziehung, ist etwas irreführend, da sich viele Ist-Ein-Beziehungen nicht gut übertragen lassen (Ein Quadrat ist ein Rechteck, trotzdem ist es meist nicht sinnvoll eine Quadrat-Klasse von einer Rechteckklasse erben zu lassen).
Da du anscheinend auf zwei unterschiedlichen Klassen arbeitest, solltest du auch zwei Vektoren anlegen. Dann kannst du die spezifischen Funktionen sicher aufrufen.
Gruß
Don06
-
-anfänger schrieb:
später muss es nämlich noch andere kinder_i geben, die zwar auch im prinzip von basis abstammen aber nichts untereinander gemeinsam haben
Sicher dass vererbung dann der richtige Weg ist?
-
-anfänger schrieb:
ich habe folgendes Kontrukt:
eine klasse basiseine davon abgeleitete klasse kind
Vererbung sollte nur bei IST-EIN Beziehungen gewählt werden. Basisklassen machen zudem nur Sinn, wenn die abgeleiteten Klassen Gemeinsamkeiten haben.
Deine Beschreibung deutet eher darauf das deine abgeleiteten Klassen vermutlich kaum Ähnlichkeiten haben. Wenn man Container mit Zeigern der Basisklasse verwendet, sollte der Regelfall sein, das man auf eine gemeinsame Schnittstelle zugreift. Wenn der Regelfall aber ist, das man spezifische Methoden aufruft, liegt hier ein Designfehler vor.
Sollte es nicht die Regel, sondern die Ausnahme sein, hilft dir dynamic_cast weiter. Da dynamic_cast aber nicht sonderlich schnell ist, sollte dies wie gesagt eine Ausnahme darstellen...
Kind * kind = dynamic_cast<Kind*>(basis); if(kind) { // Cast war erfolgreich, basis war ein Kind... }cu André
-
ich muss irgendwie in der lage sein alle kinder und basen zu durchlaufen , weiterhin müssen diese alle auf sich zugreifen können
wäre in einem vector und einem iterator sache von einer for-schleife
-
Wieso speicherst du
kind- undbasis-Instanzen nicht in zwei separaten Containern?Die gemeinsame Verwaltung in einem Container macht nur Sinn, wenn die Funktionalität ähnlich ist und beispielsweise virtuelle Funktionen aufgerufen werden. Wenn man jedes Mal mittels
dynamic_castunterscheiden muss, um welche Klasse es sich handelt, hat man etwas falsch gemacht...
-
~anfänger schrieb:
ich muss irgendwie in der lage sein alle kinder und basen zu durchlaufen , weiterhin müssen diese alle auf sich zugreifen können
wäre in einem vector und einem iterator sache von einer for-schleife
Vielleicht beschreibst du mal näher um was es geht, damit wir dir vielleicht bessere Alternativen nennen können. Es hört sich bislang nach einem Fehldesign an, und vielleicht hat ja der ein oder andere eine bessere Lösung für dich parat.