„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > So erstellen Sie Kopien abgeleiteter Klasseninstanzen aus polymorphen Basisklassenzeigern: Eine Lösung mit virtuellen Klonmethoden und CRTP

So erstellen Sie Kopien abgeleiteter Klasseninstanzen aus polymorphen Basisklassenzeigern: Eine Lösung mit virtuellen Klonmethoden und CRTP

Veröffentlicht am 07.11.2024
Durchsuche:207

How to Create Copies of Derived Class Instances from Polymorphic Base Class Pointers: A Solution Using Virtual Clone Methods and CRTP

Abgeleitete Klasseninstanzen von polymorphen Basisklassenzeigern kopieren

Für viele hat sich dieses Programmierrätsel als schwer zu fassen erwiesen. Lassen Sie uns die Komplexität untersuchen und eine effiziente Lösung finden.

Stellen Sie sich das folgende Szenario vor: Sie haben die Klassen Base, Derived1, Derived2 usw., wobei abgeleitete Klassen von Base erben. Bei einem Zeiger auf ein Basisobjekt besteht das Ziel darin, eine dynamisch zugewiesene Kopie des zugrunde liegenden abgeleiteten Objekts zu erstellen und so Probleme wie die „Absenderadresse eines temporären Objekts“ zu vermeiden.

Traditionell wurde dies durch eine Litanei gelöst von Typ-IDs oder Dynamic_casts in bedingten Anweisungen. Wir suchen jedoch nach einer eleganteren Lösung.

Virtuelle Klonmethode

Der Schlüssel liegt in der Einführung einer virtuellen clone()-Methode in die Basisklasse, die für jedes abgeleitete Objekt implementiert wird Typ. Diese Methode gibt eine Kopie des Objekts zurück. Wenn Base nicht abstrakt ist, können Sie seinen Kopierkonstruktor aufrufen, aber dieser Ansatz birgt das Risiko von Slicing, wenn er in den abgeleiteten Klassen nicht ordnungsgemäß implementiert wird.

CRTP-Idiom für die Wiederverwendung von Code

Um Codeduplizierung zu vermeiden, kann das CRTP-Idiom (Curiously Recurring Template Pattern) verwendet werden. Betrachten Sie die folgende generische Vorlage:

template 
class DerivationHelper : public Base
{
public:
  virtual Base* clone() const
  {
    return new Derived(static_cast(*this));
  }
};

Durch die Verwendung dieser Vorlage können mehrere abgeleitete Klassen von DerivationHelper erben und die clone()-Methode mithilfe ihrer jeweiligen Kopierkonstruktoren implementieren.

Implementierung und Vorteile

Diese Lösung bietet mehrere Vorteile:

  • Einfachheit: Der Code ist prägnant und einfach zu implementieren.
  • Erweiterbarkeit: Das Hinzufügen neuer abgeleiteter Klassen erfordert keine Änderung der Basisklasse.
  • Leistung: Virtuelle Funktionsaufrufe sind relativ effizient.

Durch die Nutzung der virtuellen clone()-Methode und des CRTP-Idioms können Programmierer die gewünschte Funktionalität effektiv erreichen, ohne dass komplizierte oder komplizierte Funktionen erforderlich sind fehleranfällige Ansätze.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3