Heim > Backend-Entwicklung > C++ > Hauptteil

Wie erstelle ich Kopien abgeleiteter Klasseninstanzen von Basisklassenzeigern in C?

Patricia Arquette
Freigeben: 2024-10-26 04:55:31
Original
358 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

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!