2012-04-10 106 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

另一方面,你並沒有將'〜Event'聲明爲'virtual',這通常是一件壞事。 – 2012-04-10 17:01:18

+0

哦,是的,謝謝你。我現在記得我的演講。 – dajee 2012-04-10 17:05:06

+0

在Linux上使用gcc 4.4.3編譯我。有3個警告,但沒有關於這個純虛函數的警告。 – dbv 2012-04-10 17:09:06

回答

9

的問題是,有一個名爲ModemSimV2類的兩個不同的前向聲明:

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

Eventprocess()的簽名是:

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

Dialinprocess()的定義實際上是:

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

所以Event聲明的純虛函數沒有被中實現Dialin

+0

+1。是的,它們是兩個不同的類,這意味着'Dialin'不會真正*定義基類的* pure *虛函數,而是添加一個新的虛函數。 – Nawaz 2012-04-10 17:08:59

+0

@Nawaz,是的。這就是我的意思。 – hmjd 2012-04-10 17:09:24

+1

這是一個新的C++ 11'override'屬性會很有用的地方 - 編譯器會直接告訴你(即在一個錯誤消息中),當它被定義時,'Dialin :: process'不會覆蓋任何東西。 – 2012-04-10 17:14:19