virtuelles object kopieren
-
hallo
mal angenommen ich habe sowas hier :class abstract { virtual void func1() = 0; }; class deriv : public abstract { void func() { foo() } }:
nun reiche ich sowas in irgendeine function rein
void sammle(const abstract * ptr) { // ich würde nun gerne das ding kopieren um es in einem container zu halten // und damit die verantwortung furs löschen zu haben aber damit gehts nicht : abstract * m_ptr = new abstract(*ptr); }
fehlermeldung ist :
cannot allocate object of abstract type wegen pure-virtual-functionsdamit hat er ja recht, aber wie kann ich trotzdem das ding kopieren?
virtueller copy-ctor?
ich weiss echt nicht weiter
-
In etwa so:
class abstract { virtual void func1() = 0; virtual abstract* clone() = 0; }; class deriv : public abstract { void func() { foo() } abstract* clone() { return new deriv(*this); } }: void sammle(const abstract * ptr) { abstract * m_ptr = ptr->clone(); }
-
Die clone-Methode sollte imho konstant sein, sie verändert ja das Objekt selbst nicht. Außerdem ist es möglich den Rückgabetyp anzupassen (kenne leider den Namen des Features nicht mehr):
class abstract { public: virtual void func() = 0; virtual abstract* clone() const = 0; }; class deriv : public abstract { public: void func() { foo(); } deriv* clone() const { return new deriv(*this); } }; void sammle(const abstract * ptr) { abstract* m_ptr = ptr->clone(); }
-
Don06 schrieb:
kenne leider den Namen des Features nicht mehr
Kovariante Rückgabewerte.
Der Return-Wert einer virtuellen Funktion kann in einer abgeleiteten Version durch einen More-Derived-Typen ersetzt werden.