Heim > Backend-Entwicklung > C++ > Hauptteil

So erstellen Sie abgeleitete Klasseninstanzen aus einem polymorphen Basisklassenzeiger: Ein Leitfaden zu Klonmethoden und dem CRTP-Idiom

Susan Sarandon
Freigeben: 2024-10-27 00:21:30
Original
125 Leute haben es durchsucht

How to Create Derived Class Instances from a Polymorphic Base Class Pointer:  A Guide to Clone Methods and the CRTP Idiom

Erstellen abgeleiteter Klasseninstanzen von einem Zeiger auf eine polymorphe Basisklasse

Dieses Problem tritt auf, wenn versucht wird, eine Kopie einer abgeleiteten Klasseninstanz zu erstellen von einem Zeiger auf seine polymorphe Basisklasse. Ein naiver Ansatz umfasst zahlreiche Typprüfungen und dynamische Umwandlungen, wobei jeder potenziell abgeleitete Typ überprüft und der neue Operator eingesetzt wird. Es ist jedoch eine verfeinerte Lösung verfügbar.

Der Schlüssel besteht darin, eine virtuelle Methode, Base* clone() const = 0;, in die Basisklasse zu integrieren. Jede abgeleitete Klasse muss diese Methode dann überschreiben, um einen bestimmten Klon zu erstellen. Zum Beispiel:

<code class="cpp">class Base {
  virtual ~Base();
  virtual Base* clone() const = 0;
};
class Derived1 : public Base {
  virtual Base* clone() const override { return new Derived1(*this); }
};
class Derived2 : public Base {
  virtual Base* clone() const override { return new Derived2(*this); }
};</code>
Nach dem Login kopieren

Durch Aufrufen von clone() auf dem Basiszeiger können Sie eine neue Instanz der spezifischen abgeleiteten Klasse erhalten. Dieser optimierte Ansatz macht Typprüfungen oder dynamische Umwandlungen überflüssig und erhöht die Klarheit und Effizienz des Codes.

Wenn Sie jedoch Codeduplizierung vermeiden möchten, sollten Sie die Verwendung des CRTP-Idioms (Curious Recurring Template Pattern) in Betracht ziehen. Eine Vorlagenklasse kann wie folgt definiert werden:

<code class="cpp">template <class Derived>
class DerivationHelper : public Base {
public:
  virtual Base* clone() const override {
    return new Derived(static_cast<const Derived&>(*this));
  }
};

class Derived1 : public DerivationHelper<Derived1> { ... };
class Derived2 : public DerivationHelper<Derived2> { ... };</code>
Nach dem Login kopieren

Diese Vorlagenklasse stellt, wenn sie von den abgeleiteten Klassen geerbt wird, die notwendige Implementierung für die clone()-Methode bereit, wodurch die Notwendigkeit separater Überschreibungen in jeder abgeleiteten Klasse entfällt .

Das obige ist der detaillierte Inhalt vonSo erstellen Sie abgeleitete Klasseninstanzen aus einem polymorphen Basisklassenzeiger: Ein Leitfaden zu Klonmethoden und dem CRTP-Idiom. 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
Neueste Artikel des Autors
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!