2012-02-23 5 views
25

파일 아및 상속

#ifndef A_H_ 
#define A_H_ 

class A { 
public: 
    virtual ~A(); 
    virtual void doWork(); 
}; 

#endif 

파일 Child.h

#ifndef CHILD_H_ 
#define CHILD_H_ 

#include "A.h" 

class Child: public A { 
private: 
    int x,y; 
public: 
    Child(); 
    ~Child(); 
    void doWork(); 
}; 
#endif 

그리고 Child.cpp

#include "Child.h" 

Child::Child(){ 
    x = 5; 
} 

Child::~Child(){...} 

void Child::doWork(){...}; 

컴파일러는 정의되지 않은 참조가 있음을 말한다 A에 대한 vtable. 나는 많은 다른 것들을 시도했지만 아무도 일하지 못했습니다.

내 목표는 클래스 A을 인터페이스로 사용하고 헤더에서 구현 코드를 분리하는 것입니다.

+4

선언하는 모든 비 순수 가상 함수를 정의해야합니다. 선언했지만 사용하지 않는 비 가상 함수는 정의 할 필요가 없습니다. –

답변

60

왜 오류 & 해결 방법은 무엇입니까?

당신은 class A에 모든 가상 기능에 대한 definitions를 제공해야합니다. 순수한 가상 함수들만 정의가 허용되지 않습니다.

예 :

virtual ~A(); 
virtual void doWork(); 

은 (본체 있어야) 정의되어야

예 :

A.cpp

void A::doWork() 
{ 
} 
A::~A() 
{ 
} 

class A 두 방법에서

경고 :
이 경우 당신은 당신의 class A는 인터페이스 역할을 할이 (C에서 Abstract class ++ a.k.a) 당신은이 방법은 순수 가상해야한다.

virtual void doWork() = 0; 

좋은 읽기

: A는 인터페이스로, 그리고 헤더에서 구현 코드를 분리해서하는

What does it mean that the "virtual table" is an unresolved external?
When building C++, the linker says my constructors, destructors or virtual tables are undefined.

+0

무슨 소리 야? – rjmarques

+0

@ user1227351 : 설명을 더 잘 설명하도록 업데이트되었습니다. 자세한 설명은 링크를 참조하십시오. –

+0

가상 ~ A()가 있음; 가상 void doWork() = 0; 여전히 vtable error = /를 제공합니다. 하지만 소멸자가 없으면 정상적으로 작동합니다. 그러나 그것없이, 만약 내가 뭔가를 : A * a = new Child(); 삭제 a; 분명히 Child :: ~ Child()를 호출하지 않을 것입니다. 해결 방법이 있습니까? – rjmarques

6

내 목적이다.

는이 경우,

class A { 
    // ... 
    virtual void doWork() = 0; 
}; 
+0

소멸자도 제거하면 오류가 제거됩니다. 그럴 경우 : A a = new Child(); 삭제 a; 어떤 소멸자가 호출할까요? – rjmarques

+0

파괴는 항상 공사의 역순입니다. 이 경우, 클래스'A' 소멸자는'Child' 소멸자와'A' 소멸자를 먼저 수행하도록 가상해야합니다. 'A' 클래스 소멸자가 가상이 아니면 동작은 정의되지 않습니다. – Mahesh

+0

부모 클래스 소멸자를 가상으로 만들 때 자식의 소멸자를 호출합니다. 그 후, 부모 클래스의 소멸자. – Izza

1

다른 응답의 아무도 당신을 도울 수없는 경우 모든 "* .gch"파일을 삭제해야합니다 클래스 A의 멤버 함수가 순수 가상합니다.