2013-04-03 4 views
1

여기에 문제가 있습니다. 컴파일을 시도 할 때 구현되지 않은 순수 가상 메서드 오류가 계속 발생합니다. 필자는 추상 기본 클래스에서 모든 순수 가상 메서드를 구현했습니다. 어떤 아이디어?구현되지 않은 순수 가상 메서드?

class record{ 
public: 
    virtual int getID()=0; 
    virtual record *clone(); 
}; 

및 구현 :

class sdata: public record{ 
public: 
    sdata(std::string s = ""){data=s; ID=atoi(data.substr(0,8).c_str());} 
    virtual int getID(){return ID;} 
private: 
    std::string data; 
    int ID; 
}; 

죄송합니다, 여기에 전체 오류 메시지입니다 : 여기

는 추상 기본 클래스입니다

구현되지 않은 순수 가상 메서드 'getID'에 '기록'

아마도이 코드는 오류의 원인입니다.

int hashTable::hash(record *x) { 
    return floor(m * (x->getID() * A - floor(x->getID() * A))); 
} 
+7

관련 코드를 보지 않고 ... –

+0

const를 잊지 마세요. 하지만 그래, 코드를 보면 _ 조금이라도 도움이 될 것 같아. – Nbr44

+0

@SongWang : 예 : http://stackoverflow.com/questions/2609299/use-cases-of-pure-virtual-functions-with-body. –

답변

2

오류를 일으키는 코드를 보지 않고도 정확히 무슨 일이 일어나는지 알기가 어렵습니다. 이것이 컴파일 타임 오류라면 여기에 아무 것도 나타나지 않습니다. 당신이 런타임 오류가 표시되는 경우

그러나, 내가 생각할 수있는 이것의 가장 일반적인 두 가지 원인은 다음과 같습니다

(1) (심지어 기본 클래스의 생성 자나 소멸자 내에서 멤버 함수를 호출 간접적으로).

(2) 구현되지 않은 상태에서 함수의 기본 클래스 버전을 호출하는 파생 클래스입니다.

이러한 오류의 모두가 될 보여주는 예 :

 
struct Base { 
    Base() 
    { 
     call_foo(); // Oops, indirectly calls Base::foo() (Scenario 1) 
    } 
    void call_foo() const { 
     foo(); 
    } 
protected: 
    virtual void foo() const = 0; 
};

struct Derived : Base { protected: virtual void foo() const { Base::foo(); // Oops, unimplemented virtual base function (Scenario 2) } };

int main() { Derived().call_foo(); }

== UPDATE : 가능한 컴파일시 에러 == 내가 그 기록 귀하의 예제 코드에서 관찰

가 아닌 순수한있다 -virtual clone() 멤버 함수는 record *을 반환합니다. 레코드는 추상적이므로 레코드를 직접 작성할 수 없습니다 (구체적인 서브 클래스 만). 이것은 clone() 멤버 함수가 아마도 순수 가상이어야 함을 의미합니다. 예를 들어 return new record()을 시도하면 기본 클래스에 순수 가상 함수가 있다는 오류가 발생합니다.

+0

알았어 무슨 뜻인지 알 겠어. 아마이 코드가 오류를 일으키는거야. int hashTable :: hash (record * x) { return floor (m * (x-> getID() * A - floor (x-> getID() * A))); } – mlclmss

+0

@ifiamnotmethenwhothehellami : 가능할 수도 있지만 실제로 매개 변수로 전달하는 대상에 따라 다릅니다. – Infiltrator

+0

@ifiamnotmethenwhothehellami : 해당 코드가 레코드의 생성자 (직접 또는 간접적으로)에서 오류가 발생할 수 있습니다. sdata의 생성자가 시작된 후 호출되었지만 sdata의 소멸자가 완료되기 전에 문제가 발생해서는 안됩니다. –

0

추상 기본 클래스의 모든 기능을 구현하지 않은 것 같습니다. 기지에서 함수는 서명이있는 경우 :

void SomeFuction() const; 

을 그리고 당신은 당신의 파생 클래스에서 다음 구현 : 당신이 const을 생략하기 때문에

void SomeFuction(); 

그런 다음 당신은 기능을 구현하지 않은있다. GCC는 여러분이 구현하지 않은 것을 알려 주어야합니다.

관련 : 기본의 구체적인 구현이있는 경우 파생 클래스에서 해당 이름을 숨겨야합니다. 실수로 숨어있는 기능을 찾으려면 -Woverloaded-virtual을 사용하십시오.

관련 문제