Abstrakte Klasse als Parameter
-
Hallo,
ich habe versucht, die folgende Frage per Suche zu lösen, bin aber leider gescheitert
:
Ich habe eine abstrakte Basisklasse A und zwei abgeleitete Klassen B bzw. C.
Ich möchte jetzt eine Funktion schreiben, die ein A als Parameter nimmt - in Wirklichkeit natürlich dann ein B oder C, aber ich will mich nicht festlegen... das ist ja wohl unter Anderem der Sinn von Polymorphie. Aber anscheinend darf ich abstrakte Klassen nicht als Parametertyp verwenden! Das erscheint mir irgendwie sehr merkwürdig. Es kann doch nicht sein, dass ich zwei Funktionen schreiben muss, eine, die Bs nimmt, und eine, die Cs nimmt???Ok, gerade eben sehe ich, dass es mit Referenzen funktioniert. Das ist aber auch nicht das gelbe vom Ei - ich will das übergebene Objekt nur lokal ändern! Muss ich jetzt extra manuell eine Kopie anfertigen, oder gibt es einen anderen Weg?
Danke schon mal!
-
Du musst nen Zeiger oder ne Referenz nehmen wenn polymorphes Verhalten erwünscht ist.
Wenn du nen "richtiges" A Objekt als Parameter übergeben wolltest(was ja ohnehin nicht geht weil A abstrakt ist) dann verhält sich das Objekt auch wie ein A.Egal ob es mal ein B oder C war.
Beschreib besser mal dein Problem ,ob sich da nicht ne andere Lösung finden läßt.Gruß Spacelord
-
Ja, du mußt wohl lokal ne Kopie machen, denn das würde sonst deine Signatur für dich erledigen:
void foo(Objekt a) // hier wird die Kopie von Objekt autom. erstellt { }
Deshalb ist ja auch ein abstrakter Parametertyp nicht möglich. Und ob du die Kopie in der Funktions-Signatur oder erst im Rumpf machst, ist eigentlich irrelevant.
Die einzige Alternative die mir pers. einfallen würde, ist, das du ein Template-Parameter daraus machst. Dann müsste zwar der Aufrufer deiner Funktion wissen, um was für einen Typ es sich handelt, aber du wärst aus dem Schneider.
-
Danke für eure Antworten - ich werde also manuell eine lokale Kopie anlegen. Dazu gleich noch eine Frage (ich fange gerade erst an, c++ zu programmieren - bis jetzt Java und c), und zwar eine, die sicherlich schon ein paar mal gestellt wurde, ich habe auch alles, was ich im Forum dazu gefunden habe, schon angeschaut...
ich habe also meine bisherige Funktion:
func(A aObject) { // do something with local copy aObject }
Jetzt muss ich das ganze so ändern, dass erst manuell eine lokale Kopie angelegt wird:
func(const A *aObjectPtr) { // copiedAObject = create local copy of *aObjectPtr // do something with local copy copiedAObject }
ABER ich könnte es auch so machen:
func(const A &aObjectRef) { // copiedAObject = create local copy of aObjectRef // do something with local copy copiedAObject }
Mir ist einfach bis jetzt nicht so richtig klar, wann ich welche Methode anwende, auch wenn ich wohl die Unterschiede zwischen Ref und Ptr kenne (Ref==Alias, Ref!=NULL, Ref braucht keinen Speicher, Ref kann nicht auf verschiedene Objekte zeigen).
Könnt ihr mir vielleicht einfach kurz sagen, welche Variante ihr wählen würdet und WARUM, damit ich ein bisschen was von euren Erfahrungen lernen kann.
Danke!