2012-05-14 26 views
5

Tengo la siguiente relación de clases. Quiero clonar la clase Derivada, pero obtengo el error "no puedo crear una instancia de clase abstracta". ¿Cómo puedo clonar la clase derivada? Gracias.Clonación clase C++ con métodos virtuales puros

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é es esto? Un clon es esencialmente una operación a nivel de objeto. Sin un objeto concreto, ¿cómo sabes qué clonar? – Joe

Respuesta

2

Solo se puede instalar la clase concreta. Func no debe ser puro.

4

No se puede crear una instancia de una clase que tiene una función virtual pura como esto:

virtual void yourFunction() = 0 

Hacer una subclase o eliminarlo.

+0

o proporcionar una implementación – obmarg

6

Solo se pueden crear instancias de clases concretas. Debes rediseñar la interfaz de Derived para hacer clonación. Al principio, elimine virtual void func() = 0; Entonces usted será capaz de escribir este código:

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

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

Otra solución es mantener la función virtual pura en el lugar y la adición de una clase concreta:

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

que podría estar diciendo algo estúpido aquí, pero Creo que el método de clonación en la clase derivada debería devolver un puntero a la clase base. Tal vez todavía compila bien, pero en lo que se refiere al mantenimiento del código, creo que es mejor usar el método de clonación solo para devolver los punteros a la clase base. Después de todo, si su clase derivada tiene que clonar en un puntero a una clase derivada, se puede que también acaba de hacer

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

Por supuesto, es necesario implementar el constructor de copia, pero que por lo general se debe implementar todos modos (excepto en casos extremos).

Cuestiones relacionadas