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