다음 코드 고려해 쉽게 나는 정보를 찾을 수 있습니다파생 클래스에 명시 적으로 선언 된 소멸자가 필요합니까?
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?
}
C++은 아무 것도하지 않는 코드를 작성하도록 강요하지 않습니다. C++에 Java와 관련이있는 것으로 가장하는 매크로 일 수있는 * final *에서 벗어나야합니다. Override는 가치있는 C++ 11 추가 기능입니다. 소멸자가 아니라 다른 가상 방법을 사용할 수 있습니다. 정상적인 C++ 코드를 작성하면 모든 것이 쉽게 함께 떨어집니다. –