2012-03-02 9 views
0

편집 : 나는 pure virtual function call 오류를 얻고있다순수 가상 함수를 잘못 구현 했습니까?

I have no updated the question, whilst doing so I realized the scope of the question has completely changed, so I apologize for this. I am dealing with Threads so that static function has to be there. I have tried to abstract the Threading stuff out of the question as much as possible.

은, 그래서 내가 구현 잘못이 어쩌면 생각했다.

class Base 
{ 
    protected: 
     virtual int f(void) = 0; 
     static void baseFunction(void* param); 
}; 

static void Base::baseFunction (void* param) 
{ 
    Base *parent = (Base*) parameter; 

    int i = parent->f(); 
} 

class Derived : public Base 
{ 
    private: 
     int _memeber; 
     int f(void); 
}; 

int Derived::f(void) 
{ 
    _member = 0; 

    cout << "Derived _memeber is: " << _member << endl; 

    return 0; 
} 

void main() 
{ 
    Derived d; 

    d.baseFunction(d); 
} 

내가 Derived 클래스 멤버에 액세스 할 수 있도록하는 기능 Derived::f(void)이 필요합니다 여기에 내가 가진 것입니다.

+1

실제 코드입니까? 두 클래스 중 하나를 정의한 후에는 세미콜론이 없습니다. – hmjd

+1

또한 정의는'int Derived :: f (void)'라고 정의해야합니다. 그러나 언제 오류가 발생합니까? 컴파일러 또는 런타임 오류입니까? '파생 된 '파빌리온이라고 부를 건가요? –

+0

코드는 그대로 (hmjd에 의한 모듈러스) modalo입니다. 어딘가에 또 다른 문제가 있어야합니다. –

답변

2

정의는 괜찮 은데에

int main() 
{ 
    Derived d; 
    d.f(); 
} 

를 추가,하지만 난 당신이 Base의 생성자 또는 소멸자에서 가상 함수를 호출하고 짐작됩니다. 이 경우 동적 유형이 Base이 아닌 것처럼 Derived이 아닌 가상 디스패치가 수행되고 함수가 순수 가상이면 정의되지 않은 동작이 발생합니다.

업데이트 : "스레드 처리 중"이라고 말합니다. 이 경우 데이터 경쟁으로 인해 하나의 스레드가 함수를 호출 할 수 있고 다른 스레드는 여전히 객체를 생성 할 수 있습니다. 다시 정의되지 않은 동작을 제공합니다. 모든 데이터 액세스가 올바르게 동기화되었는지 확인해야합니다.

+0

+1 : VC10에서이를 감지하고 "확인되지 않음"으로보고하고 VC9에서 "순수 가상 함수 호출"오류가 발생했습니다 –

+0

흥미 롭습니다. 파생 클래스의 생성자에서 매개 변수를 제거 했으므로 더 이상 문제를 추가하지 않습니다. 나는 문제가있다. 그래서 이렇게하면 :'파생 된 d; '는 작동하지만 이렇게합니다 :'파생 된 d = 파생 된 (param)'은하지 않습니다. – Cheetah

-2

당신은

class Derived : public Base 
{ 
    protected: 
     virtual int f(void); 
} 

나는 당신의 순수 가상 함수 호출은 그것의 방법의 또 다른에 F를 사용하여 기본 클래스에서 오는 가정 선언해야합니다.

+1

또는 기본 클래스 생성자에서'f'를 호출합니다. –

+4

아니요, 기본 클래스에서'virtual' 메서드를 선언하면 모든 파생 클래스에서 가상이됩니다. 자식들에게'virtual'을 지정할 필요는 없습니다. –

0

클래스 선언 다음에 세미콜론이 누락되었습니다. 괜찮습니다.

0

파생 된 메서드에 반환 형식을 추가하십시오. 또한 클래스 정의 뒤에 세미콜론을 추가하십시오.

0

f 및에 대한 반환 유형이 누락되었습니다. 클래스 정의 후

는 가능하면

class Base 
{ 
    protected: 
     virtual int f(void) = 0; 
}; 

class Derived : public Base 
{ 
    public: 
     int f(void); 
}; 

int Derived::f(void) 
{ 
    // do something here 
} 

또한, 포스트 실행 가능한 코드에 코드를 변경

. IOW 당신의 코드 샘플

0

두 클래스의 모든 기능을 공개로 설정하십시오. 왜 내가 int라고 선언하고 있니? 그것은 전혀 사용되지 않습니다.

관련 문제