2014-02-13 8 views
2

다음 코드 고려해 쉽게 나는 정보를 찾을 수 있습니다파생 클래스에 명시 적으로 선언 된 소멸자가 필요합니까?

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

class B: public A 
{ 
virtual void function() override final; 
public: 
    /*virtual*/ ~B() {}; // does this d-tor have to be declared at all? 
} 

기본 클래스 소멸자에 대한을, 예를 들어, 기본 클래스의 소멸자가 가상 ​​경우를 제외하고 http://en.cppreference.com/w/cpp/language/destructor

는 "기본에 포인터를 통해 개체를 삭제하면 정의되지 않은 동작 를 호출합니다. 일반적인 가이드 라인은 기본 클래스의 소멸자 중 공공 및 가상 또는 보호해야한다는 점입니다 nonvirtual "

기본 클래스의 가상 소멸자가 필수입니다. 파생 클래스의 소멸자는 어떻습니까? 명시 적으로 선언/정의해야합니까? 파생 클래스의 소멸자가 자동으로 가상이기 때문에 나는 매우 혼란 스럽습니다. 파생 클래스의 소멸자의 선언/정의를 건너 뛰려면 vtable 주소 지정의 측면에서 합법적입니까? 다음 상황은 어떨까요?

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

class B: public A 
{ 
virtual void function() override; 
public: 
    /*virtual*/ ~B() {}; // does this d-tor have to be declared at all? 
} 

class C: public B 
{ 
virtual void function() override final; 
public: 
    /*virtual*/ ~C() {}; // does this d-tor have to be declared at all? 
} 
+0

C++은 아무 것도하지 않는 코드를 작성하도록 강요하지 않습니다. C++에 Java와 관련이있는 것으로 가장하는 매크로 일 수있는 * final *에서 벗어나야합니다. Override는 가치있는 C++ 11 추가 기능입니다. 소멸자가 아니라 다른 가상 방법을 사용할 수 있습니다. 정상적인 C++ 코드를 작성하면 모든 것이 쉽게 함께 떨어집니다. –

답변

4

파생 클래스에서 명시 적으로 소멸자를 정의 할 필요가 없습니다. C++ 표준

에 따르면 클래스는 소멸자 를 (사용자 - 또는 암시 적으로 선언 여부)이 약 귀찮게 경우에도 가상

하는 가상 소멸자와 기본 클래스가있는 경우 액세스 제어는

내재적으로 선언 된 소멸자는 클래스의 인라인 공공 회원입니다.

컴파일러는 VTABLE 년에 암시 적으로 정의 소멸자의 주소를 배치합니다. 따라서 파생 클래스의 vtable에는 파생 클래스의 소멸자의 주소가 저장됩니다. 당신은 예를 들어 쓸 수있는 코드의 가독성을 위해

class B: public A 
{ 
virtual void function() override final; 
public: 
    virtual ~B() = default; 
} 
3

아니요, 신고 할 필요가 없습니다. virtual으로 선언 된 주어진 함수를 가진 클래스로부터 상속받은 클래스는 상속 된 형태를 virtual이되도록 선언 할 필요가 없으므로 virtual이됩니다. 여기에는 암시 적으로 선언 된 소멸자가 포함됩니다.

0

다른 사람이 언급 한 것처럼이 아래로 조상에서 수행하기 때문에, 아니, 당신은 하위 클래스에 아무것도 실시하지 않는 소멸자를 선언 할 필요가 없습니다 수업.

그러나 클래스 C는 VendorBAwesomeness.dll과 같은 일부 타사 라이브러리 클래스 B에서 파생 될 수 있으며 B는 mswonderful.dll의 Microsoft 클래스 A에서 파생 될 수 있음을 명심하십시오.

독자와 수업에 익숙해지기를 원할 경우 클래스 C에 대해 virtual을 지정하는 것이 좋습니다.이 정보를 읽을 때 클래스 B의 인터페이스와 클래스 B의 작성자 클래스 A에 대해 배웠을 때도 마찬가지였습니다.

이 정보를 전달하면 다른 사람들이 정보 검색을하지 않고도 코드가하는 것을 명확하게 볼 수 있습니다.

관련 문제