2012-04-10 11 views
1

派生クラスDialinが抽象クラスであるところに問題があります。なぜ私は唯一の仮想関数は同じパラメータと同じ戻り値の型を持っているので、私はなぜわからない。私が読んだことから、それは唯一の制限ですが、明らかに私は間違っています。C++の派生クラスは抽象的なエラーです

ここに私のコードです:

ヘッダー:

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; 
}; 

出典:

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

「〜イベント」を「仮想」と宣言していないのは、通常は悪いことです。 –

+0

ああ、ありがとう。私は今私の講義からそれを覚えています。 – dajee

+0

Linuxでgcc 4.4.3を使って私のためにコンパイルします。 3つの警告がありますが、その純粋な仮想機能に関してはどれもありません。 – dbv

答えて

9

問題がModemSimV2という名前のクラスの2つの異なる前方宣言があるということです。

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

process()の署名がある:

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

Dialinprocess()の定義は実際には:

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

ようEventに宣言純粋仮想関数に実装されていませんDialin

+0

+1。もちろん、これは2つの異なるクラスです。つまり、 'Dialin'は基本クラスの* pure *仮想関数を実際に*定義*しません。代わりに新しい仮想関数を追加します。 @ Nawaz、yep。 – Nawaz

+0

それは私が伝えることを意味したものです。 – hmjd

+1

これは、新しいC++ 11の 'override'属性が有用な場所です。コンパイラは、' Dialin :: process'が何も上書きしていないとコンパイラが直接(つまり、エラーメッセージで) 。 –

関連する問題