2011-09-08 9 views
24

L'errore è qui: classe"Impossibile allocare un oggetto di tipo astratto" errore

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

Nonni:

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

classe padre:

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

Actual classe/figlio:

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

Lo so che è un campo lungo, non posso scrivere l'intero codice qui ...

+0

Questo non ha intenzione di fare - postare codice reale, e in particolare luoghi in cui si dichiarano pure funzioni virtuali (cercate '= 0;'). –

+0

i costruttori sono completamente irrilevanti, dovresti aver pubblicato le dichiarazioni – lurscher

risposta

70

In C++ una classe con almeno un pure virtual function è chiamato classe astratta. Non puoi creare oggetti di quella classe, ma potresti avere solo puntatori o riferimenti ad essa.

Se si sta derivando da una classe astratta, assicurarsi di eseguire l'override e definire tutte le funzioni virtuali pure per la classe.

Dal tuo frammento La classe AliceUniversity sembra essere una classe astratta. È necessario eseguire l'override e definire tutte le funzioni virtuali pure delle classi Graduate e UniversityGraduate.

Pure le funzioni virtuali sono quelle con = 0; alla fine della dichiarazione.

Esempio: virtual void doSomething() = 0;

Per una risposta specifica, è necessario inserire la definizione della classe per la quale si ottiene l'errore e le classi da cui tale classe è che derivano.

+0

// Non puoi creare oggetti di quella classe, ma potresti avere solo puntatori o riferimenti ad essa. È corretto? – Naveen

+0

@Naveen: è corretto. –

15

È necessario disporre di alcune funzioni virtuali dichiarate in una delle classi padre e mai implementate in nessuna delle classi figlie. Assicurarsi che tutte le funzioni virtuali siano implementate da qualche parte nella catena di ereditarietà. Se la definizione di una classe include una funzione virtuale pura che non è mai implementata, un'istanza di quella classe non può mai essere costruita.

Problemi correlati