Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann ich abgeleitete Klassen tief aus Basisklassenzeigern kopieren?

DDD
Freigeben: 2024-10-25 23:09:28
Original
636 Leute haben es durchsucht

 How to Deep Copy Derived Classes from Base Class Pointers?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!