2016-09-19 2 views
-4

나는 세 가지 클래스 (쉽게 ~ B()가 정의되지 않은, 고칠 수) C++ 가상 소멸자 정의

class A { 
    // pure virtual funcs and member vars 
    virtual ~A(); 
} 

class B : public A { 
    // some more pure virtual funcs 
    virtual ~B(); 
} 

class C : public B { 
    // concrete implementations 
    ~C() {} 
} 

현재이 오류에 '소속 카테고리'에 대한 정의되지 않은 참조 '로 컴파일되지 않습니다

하지만 난이 virtual - B {} '를 정의하는 것이 올바른지 또는 ~ C가 가상이어야하고 ~ B에 대한 호출이 ~ C에 전달되도록 정의되어야하는지 궁금합니다.

순수 :이 질문은 (순수 virtuals에 대한 코드가 진짜, 그래서 말을하기는 어렵습니다,하지만 당신은 누락 된 소멸자 정의에 대해 얘기하고, 등) 순수 가상 소멸자에 대한라고 가정

+0

** ** ** ** ** 실제 코드 **는 아닙니다. 우리는 당신이 누락 된 것이 무엇인지, 컴파일에서 누락 된 누락에 대해 전혀 알지 못합니다. –

+1

순수 가상 함수는 a = 0으로 끝나야합니다. 'virtual ~ A() = 0;' –

+0

컴파일러 오류가 아니라 링커 오류가 있습니다. 또한 코드의 모든 소멸자는 가상입니다. 재정의 함수는 암시 적으로 가상입니다. –

답변

0

호출 할 수있는 가상 소멸자를 정의해야합니다.

클래스 정의에서 정의 할 수 없습니다.

그것이 그가 시체 ”을 “ 표시하지 않기 때문에 = 0을 볼 것을 비얀 스트로브 스트 룹 (언어 작성자)에 의해 오래된 코멘트를 제외하고, 클래스 정의 외부에 정의해야하는 이유 명확한 이유가 없다.


예.

struct S 
{ 
    virtual ~S() = 0; 
}; 

S::~S() {} 
+0

(추상 클래스 'A'의) 클래스 정의에서 비어있는 소멸자로 정의 할 수없는 이유는 무엇입니까? – dfri

+0

@ πάνταῥεῖ : 아니, 클래스 정의를 의미했습니다. 소멸자의. –

+1

@dfri : 빈 소멸자로 정의하면 더 이상 순수 가상이 아닙니다. –