기본 클래스가 int를 포함하고있는 파일 설명자에 대한 클래스 계층 구조를 가지고 놀았습니다. 파괴 중에 하위 클래스에 close
이 호출되고 자식 클래스는 가상 메서드 나 데이터 멤버를 추가하지 않습니다. named_file_filedes
은 경로를 가져 와서 ctor에서 open
으로 기본을 초기화하거나 가상 멤버가 아닌 함수로 초기화합니다 (예 : kqueue_filedes
에서 kevent
만 호출 할 수 있음). 이걸 감안할 때, 기본 클래스는 가상 소멸자가 필요합니까? 하위 클래스의 크기는 모두 동일하며 사용자 정의 파괴 논리를 갖고 있지 않습니다. c++11
이라는 태그가 내가 타겟팅하는 표준 버전입니다.자손 클래스에 비 정적 멤버 나 소멸자가없는 경우 가상 소멸자가 필요합니까?
1
A
답변
4
delete
파생 클래스가 기본 클래스에 대한 포인터를 통해 파생 된 경우 파생 클래스의 모양과 상관없이 동작이 가상 소멸자없이 정의되지 않습니다.
C++ 11 표준 §5.3.5/3 : 삭제 대상물의 정적 유형이 동적 유형과 다른 경우
정적 타입의 기본 클래스이어야한다 삭제할 객체의 동적 유형과 정적 유형은 가상 소멸자를 가져야하며, 동작은 정의되지 않습니다.
그러나 클래스가 생성자 만 다른 경우 파생에 대한 대안을 사용하는 것이 좋습니다. 예 : create_named_file()
과 같은 간단한 무료 함수.
5
파생 클래스 개체를 delete
기본 클래스 포인터로 파괴하려는 경우 virtual
소멸자가 필요합니다. 예를 들면 : 당신이 다형성 할 객체가 필요한 경우
class Foo {};
class Bar : public Foo {}
int main()
{
Foo* f = new Bar;
delete f; // << UNDEFINED BEHAVIOR without virtual destructor in base classe
}
또한 기본 적어도 1 virtual
방법이 필요합니다 - 예를 들어, 당신은 유도하기 위해 기지에서 이동 dynamic_cast
를 사용하려는 경우. 이 경우에는 일반적으로 가상 소멸자가 제공됩니다. 가상 소멸자 만 있으면 클래스가 다형성을 유지하는 데 충분합니다.