2017-12-09 2 views
0

C++에서 명시 적 생성자를 정의하려하지만 vtable에서 링커 오류가 발생했습니다. 링커 오류 C++ vtable

내가 무엇을 가지고 지금까지이 오류가 나에게주는 것입니다

class Sphere : public Circular{ 
public: 
    Sphere(double r); 
    string name() const {return "Sphere";} 
    double volume() const; 
    double surface_area() const; 
}; 

Sphere:: Sphere(double r): Circular(r){} 

:

"vtable for Sphere", referenced from: 
    Sphere::Sphere(double) in main.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 

을하지만이 같은 인라인 그것을 할 경우 :

class Sphere : public Circular{ 
public: 
    Sphere(double r):Circular(r){} <-- 
    string name() const {return "Sphere";} 
    double volume() const; 
    double surface_area() const; 
}; 

을 다음 그것은 어떤 오류를 던지지 않습니다. 다음은 참조를 위해 내 원형 클래스와 GeometricSolid 클래스 :

class GeometricSolid{ 
public: 
    virtual string name() const = 0; 
    virtual double volume() const = 0; 
    virtual double surface_area() const = 0; 
    virtual ~GeometricSolid(){}; 
}; 
class Circular : public GeometricSolid{ 
protected: 
    double radius; 
public: 
    virtual string name() const = 0; 
    virtual double volume() const = 0; 
    virtual double surface_area() const =0; 
    Circular(double r); 

}; 

감사합니다.

답변

1

Sphere 클래스의 경우 volume()surface_area() 함수는 정의되지 않은 상태로 남아 있습니다. 따라서 컴파일러는 Sphere 클래스에 대한 vtable을 발행하지 않습니다.

당신이 추상 구 유지 등을 정의하려면 :

class Sphere : public Circular{ 
public: 
    Sphere(double r); 
    string name() const {return "Sphere";} 
    virtual double volume() const = 0; 
    virtual double surface_area() const = 0; 
}; 

Sphere::Sphere(double r): Circular(r){} 

그렇지 않으면 이러한 기능에 대한 정의를 제공합니다.

그 이유는 vtable에있는 vptr (가상 포인터)이 어딘가를 가리켜 야하기 때문입니다.

+0

그래서 Sphere 함수를 순수 가상 함수로 만들어서 라인 생성자 호출을 수행 할 수 있습니까? 그러나 내 기능이 순수하다면 상속은 어떻게 될 것인가? wouldnt 그것은 주에서 볼륨 함수를 sphere로 부르면 어디에서 가리킬 것입니까? 기본 클래스 또는 파생 클래스? 나는 왜 우리가 이것을 할 수 있는지를 완전히 이해하고 있는지 확인하고 있습니다. –