2017-12-08 6 views
1

Ich versuche, einen neuen abgeleiteten Klassenzeiger (mit neuem Speicherort) von einem übergeordneten Klassenzeiger zu erhalten, der auf eine abgeleitete Klasse zeigt.Erstellen eines neuen abgeleiteten Typs basierend auf einer anderen Klasse

#include <iostream> 
#include <random> 
class parent{ 
public: 
    virtual void print(){ 
     printf("p\n"); 
    } 
}; 

class dev1: public parent{ 
public: 
    void print(){ 
     printf("d1\n"); 
    } 
}; 

class dev2:public parent{ 
public: 
    void print(){ 
     printf("d2\n"); 
    } 
}; 

int main(int argc, const char * argv[]) { 
    srand(time(NULL)); 

    parent*bob; 

    if(rand()%2){ 
     bob = new dev1(); 
    }else{ 
     bob = new dev2(); 
    } 
    bob->print(); 

    parent * bobwannabe; 

    bobwannabe = new typeof(*bob); 

    bobwannabe->print(); 

    return 0; 
} 

Ich hatte gehofft, bobwannabe was druckt bob drucken. Bobwannabe sollte nicht auf dasselbe Objekt wie Bob zeigen, sondern sollte dieselbe Klasse wie Bob sein.

Im Moment wird Bobwannabe ein neues Elternteil. Gibt es eine Möglichkeit, es zu einem neuen Bob mit seinem aktuellen Typ zu machen, oder gibt es einen bestimmten Begriff, nach dem ich suchen sollte? Vielen Dank!

+1

Dies ist nicht möglich. Der Typ in einer 'neuen' Anweisung ist statisch. Das heißt, es muss zur Kompilierzeit bekannt sein. Eine Klonfunktion, wie in der Antwort unten beschrieben, ist eine beliebte Lösung für Ihr Problem. –

+1

Haben Sie überhaupt gesucht? z.B. [Wie kopiere/erstelle ich abgeleitete Klasseninstanzen von einem Zeiger auf eine polymorphe Basisklasse?] (Https://stackoverflow.com/questions/5731217/how-to-copy-create-derived-class-instance-froma-a- pointer-zu-polymorphe-base-c)/[Wie kann eine abgeleitete C++ - Klasse sich selbst über einen Basiszeiger klonen?] (https://stackoverflow.com/questions/3136646/how-can-a-derived-c -class-clone-selbst-via-a-base-pointer)/[C++ elegant abgeleitete Klasse durch Aufruf der Basisklasse] (https://stackoverflow.com/questions/36189838/c-elegantly-clone-derived-class- by-calling-base-class) –

Antwort

1

Was Sie wollen, ist das Objekt zu klonen. Sie müssen es selbst tun, indem Sie einen virtuellen Klon-Methode hinzufügen und kopieren Konstruktor der übergeordneten Klasse:

virtual parent * clone() const { return new parent(*this); } 

Und außer Kraft setzen in alle abgeleiteten Klassen wie für dev1:

virtual parent * clone() const override { return new dev1(*this); } 

und verwenden mit:

parent *bobwannabe = bob->clone(); 

Siehe auch 'typeid' versus 'typeof' in C++ und vergessen Sie nicht, Ihre Objekte zu löschen oder intelligente Zeiger verwenden.

+2

Tipps: Sie können 'new auto (* this)' verwenden, um zu vermeiden, dass Sie den Typ von Hand eingeben. Sie sollten aber lieber 'std :: unique_ptr' anstelle eines rohen Besitzerzeigers verwenden. In jedem Fall ist das [CRTP] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) das perfekte Werkzeug, um diese "Klon" -Funktion in alle Klassen zu injizieren. – Quentin

Verwandte Themen