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?
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.
Ich habe CMoreDerivedClass
und CAnotherDerivedClass
hinzugefügt, um die Hierarchie ein wenig zu erweitern, um Typenüberprüfungen usw. besser zu zeigen.