Neues Object von abgeleitetem Typ erzeugen
-
Folgende Problemstellung:
Ich habe eine Klasse A, von der eine weitere Klasse Aa erbt. Aus beiden Klassen können neue Objekte erzeugt werden. A besitzt jetzt eine Methode clone() welche als Rückgabewert ein neues Objekt vom Typ a bzw. Aa haben soll.
Meine einzige Idee dazu wäre, dass innerhalb von A::clone() überprüft wird, von welchem Typ this wirklich ist und dann entweder ein "new A()" oder ein "new Aa()" aufgerufen wird.
Meine Frage hier: geht das auch einfacher? sprich gibt es eine Möglichkeit, den new-Operator so aufzurufen, dass automatisch der Konstruktor des jeweils aktuellen this-Objektes verwendet wird?
Also in etwa so:
Ich habe ein Objekt vom Typ Aa und rufe clone() auf. Dieses clone ist zwar von A geerbt (aber nicht überschrieben), ruft aber trotzdem Aa() auf.
-
Mach clone() virtuell, dann wird doch automatisch das "richtige" clone() aufgerufen. Oder versteh ich Dein Problem nicht richtig?
In etwa so:
class A { ... A(A const & a) {...} // copy ctor ... virtual A* clone() {return new A(*this);} }; class Aa : public A { ... Aa(Aa const & a) {...} // copy ctor ... /*virtual*/ A* clone() {return new Aa(*this);} };
-
Ja, da gibt es ein Verständnisproblem: clone() soll nur in A existieren, nicht aber separat in Aa.
-
ElBlues schrieb:
Ja, da gibt es ein Verständnisproblem: clone() soll nur in A existieren, nicht aber separat in Aa.
warum?
-
theta schrieb:
ElBlues schrieb:
Ja, da gibt es ein Verständnisproblem: clone() soll nur in A existieren, nicht aber separat in Aa.
warum?
Damit der gleiche Code, der sich nur im Konstruktor unterscheiden würde nicht mehrfach vorhanden ist?
Noch mal: ich weiß, dass es auch anders geht, z.B. clone() in jeder abgeleiteten Klasse anlegen und die Initialisierung in der vererbenden Klasse ausführen, aber das ist nicht meine Frage!
-
ElBlues schrieb:
theta schrieb:
ElBlues schrieb:
Ja, da gibt es ein Verständnisproblem: clone() soll nur in A existieren, nicht aber separat in Aa.
warum?
Damit der gleiche Code, der sich nur im Konstruktor unterscheiden würde nicht mehrfach vorhanden ist?
Noch mal: ich weiß, dass es auch anders geht, z.B. clone() in jeder abgeleiteten Klasse anlegen und die Initialisierung in der vererbenden Klasse ausführen, aber das ist nicht meine Frage!
Die Frage ist:
Was willst Du clonen? Die jeweiligen abgeleiteten Klasse, oder immer nur die Basisklasse?
Im Normalfall weiss die Basisklasse erstmal nichts von ihren abgeleiteten Klassen. Deshalb muss auch jede abgeleitete Klasse ihre eigene Clone-Mothode haben. Sonst würden ja die Elemente der abgeleiteten Klassen nicht mitgeclont werden können.