2016-06-27 5 views
0

여기 cpp에 새로 온 사람이 있습니다.가상 함수에 대한 정적 멤버 반환, 추상 클래스에 대한 vtable 누락

가상 기능을 구현할 때 정적 속성을 반환하려고했습니다. 이 문제는 함수가 구현되지 않았다는 링커 오류를 발생시킵니다. 나는이 문제로 인해 길을 잃었다.

나는 다음과 같은 옷을 벗었 코드 오류를 재현 할 수 있었다 :

#include <iostream> 
#include <map> 

class Abstract1 { 
public: 
    virtual char* getFoo(); 
}; 

class Base: public Abstract1 { 
public: 
    char* getFoo() { 
     return Base::mapper[1]; 
    } 
    static std::map<int,char*> mapper; 
}; 

std::map<int, char*> Base::mapper; 
int main(int argc, const char * argv[]) { 
    Base::mapper[0] = "Hello!\n"; 
    Base::mapper[1] = "Goodbye!\n"; 
    Base* hello = new Base(); 
    // insert code here... 
    std::cout << hello->getFoo() << "\n"; 
    return 0; 
} 

는 다음 링커 오류 항복 :

Undefined symbols for architecture x86_64: 
    "typeinfo for Abstract1", referenced from: 
     typeinfo for Base in main.o 
    "vtable for Abstract1", referenced from: 
     Abstract1::Abstract1() in main.o 
+0

'Abstract1' 포인터에서 삭제하려는 경우 가상 소멸자를 추가해야합니다. –

답변

1

Abstract1::getFoo는 단순히 가상이 아닌 추상적이다.

초록 : virtual char * getFoo() = 0;으로 만들거나 기본 구현을 제공 할 수 있습니다.

+0

그게 다야! 나는 그것들이 똑같은 것이라고 생각했다. 나는 틀렸다고 생각한다. 더 많은 것을 알 필요가있다! 감사! –

+0

np, btw 실제 용어는 [* 순수 가상 *] (http://en.cppreference.com/w/cpp/language/abstract_class)입니다. –