Erstellen von Kopien abgeleiteter Klassen aus Basisklassenzeigern
Stellen Sie sich die Herausforderung vor, eine tiefe Kopie einer abgeleiteten Klasseninstanz von einem Zeiger auf zu erstellen seine polymorphe Basisklasse. Dies kann schwierig sein, da das Verlassen auf mehrere Typ-IDs oder dynamische Umwandlungen in if-Anweisungen mühsam werden und Auswirkungen auf die Leistung haben kann.
Ein bevorzugter Ansatz besteht darin, eine virtuelle Methode in die Basisklasse zu integrieren, bekannt als clone() oder copy(). Diese Methode sollte einen Zeiger auf eine neu erstellte Kopie der abgeleiteten Klasse zurückgeben. Durch die Implementierung dieser Methode in jeder abgeleiteten Klasse wird der Kopiervorgang unabhängig von den spezifischen abgeleiteten Klassentypen.
Alternativ kann zur Vermeidung von Codeduplizierungen das Curiously Recurring Template Pattern (CRTP)-Idiom verwendet werden. Mithilfe einer Vorlage kann eine Hilfsklasse erstellt werden, die den Kopiervorgang an den Konstruktor der abgeleiteten Klasse delegiert.
Implementierung mit der Clone()-Methode:
<code class="cpp">class Base { virtual Base* clone() const = 0; }; class Derived1 : public Base { Base* clone() const { return new Derived1(*this); } }; class Derived2 : public Base { Base* clone() const { return new Derived2(*this); } }; Base* CreateCopy(Base* base) { return base->clone(); }</code>
Implementierung mit CRTP-Idiom:
<code class="cpp">template <class Derived> class DerivationHelper : public Base { public: Base* clone() const { return new Derived(static_cast<Derived&>(*this)); } }; class Derived1 : public DerivationHelper<Derived1> { ... }; class Derived2 : public DerivationHelper<Derived2> { ... };</code>
Das obige ist der detaillierte Inhalt vonWie kann ich abgeleitete Klassen tief aus Basisklassenzeigern kopieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!