2012-04-10 2 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을 사용하여 나를 컴파일합니다. 세 가지 경고가 있지만 그 순수한 가상 기능에 관해서는 아무도 없습니다. – dbv

답변

9

문제는 ModemSimV2라는 클래스의 두 개의 서로 다른 기대 선언이 있다는 것입니다 :

여기

내 코드입니다
Event::ModemSimV2   // These are different classes 
Dialin::ModemSimV2   // with the same unqualified name. 

Event에서 process()의 서명은 다음과 같습니다

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

Dialinprocess()의 정의는 실제로 :

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

그래서 Event에서 선언 된 순수 가상 함수가 구현되지 않는 Dialin.

+0

+1. 예, 그들은 두 개의 다른 클래스입니다. 즉, 'Dialin'은 기본 클래스의 * pure * 가상 함수를 실제로 정의하지 않고 대신 새로운 가상 함수를 추가합니다. – Nawaz

+0

@Nawaz, 네. 그것이 내가 전달하려는 것입니다. – hmjd

+1

이것은 새로운 C++ 11'override' 속성이 유용 할 장소입니다 - 컴파일러는 정의 된대로'Dialin :: process'가 아무것도 덮어 쓰지 않는다는 것을 직접 알려줍니다 (즉, 오류 메시지에서). . –

관련 문제