Erstellen abgeleiteter Klasseninstanzen aus polymorphen Basisklassenzeigern
Bei der objektorientierten Programmierung ist es häufig erforderlich, abgeleitete Instanzen zu kopieren oder zu erstellen Klassen von Zeigern auf polymorphe Basisklassen. Dieser Vorgang kann jedoch eine Herausforderung darstellen, wenn mehrere abgeleitete Typen vorhanden sind.
Der naive Ansatz, mehrere Typ-IDs oder dynamische_Casts in if-Anweisungen zu verwenden, um nach jedem Typ zu suchen, und dann „new“ zu verwenden, ist ineffizient und fehleranfällig. Eine bessere Lösung besteht darin, eine virtuelle Methode in der Basisklasse zu verwenden, um eine Kopie zu erstellen.
Virtuelle clone()-Methode
Durch Definieren eines virtuellen clone( )-Methode in der Basisklasse und deren Implementierung in jeder abgeleiteten Klasse ist es möglich, dynamisch eine Kopie der abgeleiteten Klasseninstanz zu erstellen. Die Methode clone() sollte einen Zeiger auf die neu erstellte Kopie zurückgeben.
<code class="cpp">class Base { virtual ~Base(); // Returns a dynamically created copy of this object virtual Base* clone() const = 0; };</code>
<code class="cpp">class Derived1 : public Base { // Implements the clone() method for Derived1 virtual Base* clone() const { return new Derived1(*this); } };</code>
<code class="cpp">class Derived2 : public Base { // Implements the clone() method for Derived2 virtual Base* clone() const { return new Derived2(*this); } };</code>
Mit diesem Ansatz können Sie eine Kopie einer abgeleiteten Klasseninstanz erstellen von einem Basisklassenzeiger wie folgt:
<code class="cpp">Base* basePtr = new Derived1(); Base* copyPtr = basePtr->clone();</code>
CRTP-Idiom für minimalistische Implementierung
Um eine Duplizierung des Codes für die Implementierung von clone()-Methode in jeder abgeleiteten Klasse können Sie das Curiously Recurring Template Pattern (CRTP)-Idiom verwenden:
<code class="cpp">template <class Derived> class DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast<const Derived&>(*this)); } };</code>
<code class="cpp">class Derived1 : public DerivationHelper<Derived1> { // Other members... };</code>
<code class="cpp">class Derived2 : public DerivationHelper<Derived2> { // Other members... };</code>
clone()-Methode in jeder abgeleiteten Klasse und stellen Sie gleichzeitig sicher, dass der Kopierkonstruktor für den richtigen Typ aufgerufen wird.
Das obige ist der detaillierte Inhalt vonWie erstelle ich abgeleitete Klasseninstanzen aus polymorphen Basisklassenzeigern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!