Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erstelle ich Kopien abgeleiteter Klasseninstanzen von Basisklassenzeigern in C?

Wie erstelle ich Kopien abgeleiteter Klasseninstanzen von Basisklassenzeigern in C?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 04:55:31359Durchsuche

How to Create Copies of Derived Class Instances from Base Class Pointers in C  ?

Polymorphismus: Erstellen von Kopien abgeleiteter Klasseninstanzen aus Basisklassenzeigern

Bei der objektorientierten Programmierung stoßen Sie häufig auf Szenarien, bei denen Sie sie benötigen um Kopien abgeleiteter Klasseninstanzen zu erstellen und gleichzeitig über Zeiger auf ihre polymorphe Basisklasse auf sie zuzugreifen. Diese Aufgabe kann eine Herausforderung sein, insbesondere wenn die Verwendung externer Bibliotheken oder komplexer Codestrukturen vermieden wird.

Das Problem:

Bedenken Sie die folgende Klassenhierarchie:

<code class="cpp">class Base {
  virtual ~Base();
};
class Derived1 : public Base { ... };
class Derived2 : public Base { ... };</code>

Das Ziel besteht darin, eine Methode, CreateCopy(Base* base), zu erstellen, die eine dynamisch erstellte Kopie der Instanz zurückgibt, auf die base zeigt. Es ist wichtig, die Rückgabe eines Verweises auf ein temporäres Objekt zu vermeiden, um Laufzeitfehler zu vermeiden.

Der naive Ansatz:

Ein naiver Ansatz würde die Verwendung mehrerer Typeids oder Dynamic_Casts in einem beinhalten Reihe von if-Anweisungen, um den spezifischen abgeleiteten Klassentyp zu bestimmen und dann den neuen Operator zum Erstellen einer Kopie zu verwenden. Diese Methode ist jedoch umständlich und fehleranfällig.

Ein besserer Ansatz:

Eine elegantere und vielseitigere Lösung besteht darin, eine virtuelle Methode in der Basisklasse einzuführen:

<code class="cpp">class Base {
  virtual ~Base();
  virtual Base* clone() const = 0;
};</code>

Jede abgeleitete Klasse implementiert dann ihre eigene clone()-Methode, um eine Kopie der Instanz zu erstellen.

CRTP (Curiously Recurring Template Pattern):

Um eine Duplizierung der clone()-Implementierung in jeder abgeleiteten Klasse zu vermeiden, können Sie das CRTP-Idiom über eine Vorlagenklasse nutzen:

<code class="cpp">template <class Derived>
class DerivationHelper : public Base {
public:
  virtual Base* clone() const {
    return new Derived(static_cast<const Derived&>(*this)); // call the copy ctor.
  }
};</code>

Abgeleitete Klassen können jetzt von DerivationHelper statt direkt von Base erben :

<code class="cpp">class Derived1 : public DerivationHelper<Derived1> { ... };
class Derived2 : public DerivationHelper<Derived2> { ... };</code>

Dieser Ansatz stellt sicher, dass alle abgeleiteten Klassen Zugriff auf die clone()-Methode haben, ohne dass eine manuelle Implementierung in jeder Klasse erforderlich ist.

Das obige ist der detaillierte Inhalt vonWie erstelle ich Kopien abgeleiteter Klasseninstanzen von Basisklassenzeigern in C?. 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