Klonen als abgeleitetes Objekt in C ++

8

Ich definiere zwei Klassen in C ++. Einer ist die Basisklasse und einer ist eine abgeleitete Klasse

%Vor%

Und möchte eine Klonfunktion wie folgt implementieren:

%Vor%

Wenn ein Objekt von CDerivedClass an Clone übergeben wird, erstellt die Funktion auch ein CDerivedClass-Objekt und gibt es zurück. Wenn ein Objekt von CBaseClass an Clone übergeben wird, erstellt die Funktion auch ein CBaseClass-Objekt und return.

Wie implementiert man eine solche Funktion?

    
alancc 24.07.2014, 16:47
quelle

3 Antworten

1

Hier ist eine einfache Lösung. Denken Sie daran, für jede Klasse in der Vererbung einen Klon anzugeben.

%Vor%     
Neil Kirk 24.07.2014 16:54
quelle
1

Das virtuelle Klonmuster wird häufig verwendet, um Probleme wie diese zu lösen. Klassische Lösungen verwenden tendenziell co-variante Rückgabetypen für die Methode clone() . Andere Lösung injizieren eine Factory-Typ-Klasse (mit CRTP) zwischen der Basis und den abgeleiteten Klassen. Es gibt sogar Lösungen, die diese Funktionalität nur mit Makros implementieren. Siehe C ++ - FAQ , C ++ - Idiome und ein blog auf diesem . Jede dieser Lösungen ist praktikabel und die geeignetste hängt vom Kontext ab, in dem sie verwendet werden und verwendet werden sollen.

Ein klassischer Ansatz, der kovariante Rückgabetypen verwendet und mit moderneren RAII-Techniken gekoppelt ist ( shared_ptr et. al. ) bietet eine sehr flexible und sichere Kombination. Einer der Vorteile des kovarianten Rückgabetyps besteht darin, dass Sie einen Klon auf der gleichen Ebene in der Hierarchie wie das Argument erhalten können (d. H. Die Rückgabe erfolgt nicht immer zur Basisklasse).

Die Lösung erfordert Zugriff auf shared_ptr und / oder unique_ptr . Falls Booster mit Ihrem Compiler nicht verfügbar ist, bietet Boost Alternativen für diese. Die clone_shared und clone_unique basieren auf den entsprechenden Dienstprogrammen make_shared und make_unique der Standardbibliothek. Sie enthalten explizite Typprüfungen für die Klassenhierarchie der Argumente und Zieltypen.

%Vor%

Ich habe CMoreDerivedClass und CAnotherDerivedClass hinzugefügt, um die Hierarchie ein wenig zu erweitern, um Typenüberprüfungen usw. besser zu zeigen.

Beispielcode

    
Niall 25.07.2014 08:45
quelle
0

Sie können dies mit einer virtuellen Clone-Methode und einer CRTP-Hilfschablonen-Klasse erreichen, um diese Schnittstelle zu implementieren:

%Vor%

Nun hat jede abgeleitete Klasse eine Clone -Methode mit freundlicher Genehmigung der Hilfsklasse.

    
jxh 24.07.2014 16:53
quelle

Tags und Links