Heim  >  Artikel  >  Backend-Entwicklung  >  So erstellen Sie abgeleitete Klasseninstanzen aus einem polymorphen Basisklassenzeiger: Ein Leitfaden zu Klonmethoden und dem CRTP-Idiom

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

Susan Sarandon
Susan SarandonOriginal
2024-10-27 00:21:30126Durchsuche

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>

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>

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!

Stellungnahme:
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