2012-04-10 7 views
1

Ich habe ein Problem, wo Dialin, die abgeleitete Klasse ist abstrakt. Ich bin nicht sicher, warum, da die einzige virtuelle Funktion, die ich habe, die gleichen Parameter und die gleichen Rückgabetypen hat. Nach dem, was ich gelesen habe, ist das die einzige Einschränkung, aber anscheinend liege ich falsch.C++ Abgeleitete Klasse ist abstrakter Fehler

Hier ist mein Code:

Rubrik:

class Event{ 
    class ModemSimV2; 

public: 
    Event(); 
    Event(const Event &e); 
    ~Event(); 

    virtual void process(ModemSimV2 &m) = 0; 

protected: 
    int who;  // the number of the user 
    int time;  // when the event will occur 
    int what;  // DIAL_IN or HANGUP 
}; 


class Dialin : public Event{ 
    class ModemSimV2; 
public: 
    Dialin(int name = 0, int tm = 0); 
    Dialin(const Dialin &d); 
    ~Dialin(); 

    virtual void process(ModemSimV2 &m); 

private: 
    int who; 
    int time; 
    int what; 
}; 

Quelle:

Event::Event(){ 
} 

Event::Event(const Event &e) { 
    *this = e; 
} 

Event::~Event() { 
} 

Dialin::Dialin (int name, int tm) 
: time(tm), who(name) { 
    return; 
} 

Dialin::Dialin (const Dialin &d) { 
    *this = d; 
} 

Dialin::~Dialin() { 
} 

void Dialin::process(ModemSimV2 &m) {   
} 
+7

Zu einer anderen Notiz, Sie haben '~ Event' nicht als' virtual' deklariert, was normalerweise eine schlechte Sache ist. –

+0

Oh ja, danke dafür. Daran erinnere ich mich aus meinem Vortrag. – dajee

+0

Kompiliert für mich mit gcc 4.4.3 unter Linux. Es gibt 3 Warnungen, aber keine davon in Bezug auf diese reine virtuelle Funktion. – dbv

Antwort

9

Das Problem ist, dass es zwei verschiedene Vorwärtsdeklarationen einer Klasse ModemSimV2 genannt:

Event::ModemSimV2   // These are different classes 
Dialin::ModemSimV2   // with the same unqualified name. 

In Event, die Unterschrift von process() ist:

virtual void process(Event::ModemSimV2 &m) = 0; 

und in Dialin die Definition von process() ist eigentlich:

virtual void process(Dialin::ModemSimV2 &m); 

so die reine Event erklärte virtuelle Funktion wird nicht in umgesetzt Dialin.

+0

+1. Ja, sie sind zwei verschiedene Klassen, was bedeutet, dass "Einwählen" nicht wirklich * die * reine * virtuelle Funktion der Basisklasse definiert, stattdessen fügt sie eine neue virtuelle Funktion hinzu. – Nawaz

+0

@ Nawaz, ja. Das wollte ich vermitteln. – hmjd

+1

Dies ist eine Stelle, an der das neue C++ 11-'override'-Attribut nützlich wäre - der Compiler würde Ihnen direkt sagen (dh in einer Fehlermeldung), dass' Dialin :: process' nichts definiert . –