Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erstelle ich abgeleitete Klasseninstanzen aus polymorphen Basisklassenzeigern?

Wie erstelle ich abgeleitete Klasseninstanzen aus polymorphen Basisklassenzeigern?

DDD
DDDOriginal
2024-10-27 00:09:30517Durchsuche

 How to Create Derived Class Instances from Polymorphic Base Class Pointers?

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>
Dieser Ansatz implementiert automatisch die

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!

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