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:
templateclass 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:
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.
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