2011-09-08 24 views
24

error está aquí: Clase"No se puede asignar un objeto de tipo abstracto" error

vector<Graduate *> graduates; 
graduates.push_back(new AliceUniversity(identifier,id,salary,average)); 

Abuelos:

Graduate::Graduate(char identifier, 
        long id, 
        int salary, 
        double average) 
    : _identifier(identifier), 
     _id(id),_salary(salary), 
     _average(average) 
{ 
} 

clase de Padres:

UniversityGraduate::UniversityGraduate(char identifier, 
             long id, 
             int salary, 
             double average) 
    : Graduate(identifier,id,salary,average) 
{ 
} 

real de clase/niño:

AliceUniversity::AliceUniversity(char identifier, 
           long id, 
           int salary, 
           double average) 
    : UniversityGraduate(identifier,id,salary,average) 
{ 
    _graduateNum++; 
    _sumOfGrades += average; 
    _avrA = getAverage(); 
} 

Sé que es una posibilidad muy remota, yo puedo escribir el código completo aquí ...

+0

Esto no va a hacer: publicar código real, y en lugares específicos donde declaras funciones virtuales puras (busca '= 0;'). –

+0

los constructores son completamente irrelevantes, debería haber publicado las declaraciones – lurscher

Respuesta

70

En C++ una clase con al menos un pure virtual function se llama clase abstracta. No puede crear objetos de esa clase, pero solo puede tener punteros o referencias a ella.

Si se deriva de una clase abstracta, asegúrese de anular y definir todas las funciones virtuales puras para su clase.

De su fragmento Su clase AliceUniversity parece ser una clase abstracta. Necesita sobrescribir y definir todas las funciones virtuales puras de las clases Graduate y UniversityGraduate.

Las funciones virtuales puras son las que tienen = 0; al final de la declaración.

Ejemplo: virtual void doSomething() = 0;

Para una respuesta específica, tendrá que publicar la definición de la clase para la cual se obtiene el error y las clases de las que se derivan de esa clase es.

+0

// No puede crear objetos de esa clase, pero solo puede tener punteros o referencias a él.// ¿Es correcto? – Naveen

+0

@Naveen: Eso es correcto. –

15

Debe tener alguna función virtual declarada en una de las clases principales y nunca implementada en ninguna de las clases secundarias. Asegúrese de que todas las funciones virtuales estén implementadas en algún lugar de la cadena de herencia. Si la definición de una clase incluye una función virtual pura que nunca se implementa, nunca se podrá construir una instancia de esa clase.

Cuestiones relacionadas