Heim >Backend-Entwicklung >C++ >So erstellen Sie Kopien abgeleiteter Klasseninstanzen aus polymorphen Basisklassenzeigern: Eine Lösung mit virtuellen Klonmethoden und 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 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 Derived> class DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast<const Derived&>(*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:
Durch die Verwendung der virtuellen clone()-Methode und des CRTP-Idioms können Programmierer effektiv das Gewünschte erreichen Funktionalität ohne die Notwendigkeit komplizierter oder fehleranfälliger Ansätze.
Das obige ist der detaillierte Inhalt vonSo erstellen Sie Kopien abgeleiteter Klasseninstanzen aus polymorphen Basisklassenzeigern: Eine Lösung mit virtuellen Klonmethoden und CRTP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!