2012-05-14 3 views
5

J'ai la relation de classes suivante. Je veux cloner la classe Derived, mais je reçois l'erreur "impossible d'instancier une classe abstraite". Comment je peux cloner la classe dérivée? Merci.Clonage de la classe C++ avec des méthodes virtuelles pures

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

Qu'est-ce que cela ferait? Un clone est essentiellement une opération au niveau de l'objet. Sans un objet concret, comment savez-vous quoi cloner? – Joe

Répondre

2

Seule la classe concrète peut être instanciée. Func ne devrait pas être pur.

4

Vous ne pouvez pas instancier une classe qui a une fonction virtuelle pure comme ceci:

virtual void yourFunction() = 0 

Faire une sous-classe ou le supprimer.

+0

ou fournir une implémentation – obmarg

6

Seules les classes concrètes peuvent être instanciées. Vous devez revoir l'interface de Derived afin de faire du clonage. Dans un premier temps, supprimez virtual void func() = 0; Ensuite, vous serez en mesure d'écrire ce code:

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

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

Une autre solution est de garder la fonction virtuelle pure en place et en ajoutant une classe concrète:

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

Je pourrait dire ici quelque chose de stupide, mais Je pense que la méthode clone dans la classe dérivée doit toujours renvoyer un pointeur vers la classe de base. Peut-être qu'il se compile encore bien, mais en ce qui concerne la maintenabilité du code, je pense qu'il est préférable d'utiliser la méthode clone uniquement pour renvoyer des pointeurs vers la classe de base. Après tout, si votre classe dérivée doit cloner dans un pointeur vers une classe dérivée, vous pourriez tout aussi bien faire

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

Bien sûr, vous avez besoin de mettre en œuvre le constructeur de copie, mais devrait normalement être mis en œuvre de toute façon (sauf cas extrêmes).

Questions connexes