2012-05-14 9 views
5

Ich habe die folgende Beziehung von Klassen. Ich möchte die abgeleitete Klasse klonen, aber ich bekomme den Fehler "abstrakte Klasse nicht instanziieren". Wie kann ich die abgeleitete Klasse klonen? Vielen Dank.Cloning C++ Klasse mit rein virtuellen Methoden

class Base { 
public: 
    virtual ~Base() {} 
    virtual Base* clone() const = 0; 
}; 

class Derived: public Base { 
public: 
    virtual void func() = 0; 
    virtual Derived* clone() const { 
     return new Derived(*this); 
    } 
}; 
+0

Was würde das tun? Ein Klon ist im Wesentlichen eine Operation auf Objektebene. Ohne ein konkretes Objekt, woher weißt du, was du klonen musst? – Joe

Antwort

2

Nur konkrete Klasse kann instanziiert werden. Func sollte nicht rein sein.

4

Sie können nicht eine Klasse instanziiert, die eine rein virtuelle Funktion wie diese hat:

virtual void yourFunction() = 0 

eine Unterklasse Stellen oder entfernen.

+0

oder eine Implementierung bereitstellen – obmarg

6

Nur konkrete Klassen können instanziiert werden. Sie müssen die Schnittstelle von Derived neu gestalten, um das Klonen durchzuführen. Entfernen Sie zuerst virtual void func() = 0;

class Base { 
public: 
    virtual ~Base() {} 
    virtual Base* clone() const = 0; 
}; 

class Derived: public Base { 
public: 
    virtual Derived* clone() const { 
     return new Derived(*this); 
    } 
}; 

Eine andere Lösung rein virtuelle Funktion in-Place und das Hinzufügen einer konkreten Klasse hält: Dann werden Sie diesen Code schreiben können

class Base { 
public: 
    virtual ~Base() {} 
    virtual Base* clone() const = 0; 
}; 

class Derived: public Base { 
public: 
    virtual void func() = 0; 
}; 

class Derived2: public Derived { 
public: 
    virtual void func() {}; 
    virtual Derived2* clone() const { 
     return new Derived2(*this); 
    } 
}; 
0

Ich könnte hier etwas sagen dumm, aber Ich denke, dass die Klonmethode in der abgeleiteten Klasse immer noch einen Zeiger auf die Basisklasse zurückgeben sollte. Vielleicht kompiliert es immer noch gut, aber soweit es die Wartbarkeit des Codes betrifft, ist es besser, den Methodenklon nur zu verwenden, um Zeiger auf die Basisklasse zurückzugeben. Nach allem, wenn die abgeleitete Klasse in einen Zeiger auf eine abgeleitete Klasse zu klonen hat, könnten Sie auch tun, nur

Derived original; 
Derived* copy = new Derived(original) 

Natürlich müssen Sie den Copy-Konstruktor implementieren, aber das in der Regel ohnehin umgesetzt werden soll (außer für extreme Fälle).

Verwandte Themen