우리가이 같은 순수 가상 소멸자, 사용할 수있는 것으로 알려져있다 : 표준이 10.4 [class.abstract] p2
소멸자의 순수 가상 함수 호출이 UB 인 경우 왜 순수 가상 Desrtuctor를 사용할 수 있습니까?
순수 가상 함수라고 불리는 경우에 ...에만 정의 할 필요가 있기 때문에
struct A { virtual ~A() = 0; }; A::~A() {} struct B : A {};
을 (12.4 [class.dtor])
그리고 나중에 12.4 [class.dtor] p9
소멸자는 가상 (10.3) 또는 순수 가상 (10.4)로 선언 할 수 있습니다. 해당 클래스의 객체 나 파생 된 클래스가 프로그램에 생성되면 소멸자가 정의됩니다.
위의 코드를 완벽하게 유효하다는 것을 의미
-A::~A
그것이 정의, 가상 순수 할 수있다, B::~B
암시 A::~A
를 호출합니다.
지금까지 그렇게 좋았습니다.
그리고 나는 10.4 [class.abstract] p6
읽기 :
멤버 함수가 생성자 (또는 소멸자) 추상 클래스에서 호출 할 수 있습니다; 그러한 생성자 (또는 소멸자)로부터 생성 (또는 소멸)되는 객체에 대해 직접 또는 간접적으로 순수 가상 함수에 가상 호출 (10.3)을하는 효과는 정의되지 않습니다.
하지만 정확히 여기서 우리가하는 것은 - 우리는 소멸자에서 순수 가상 함수 A::~A
을 호출합니다.
그래서 어떤 모순이 있습니까?
소멸자는 특별한 경우입니다. 순수 가상이라 할지라도 소멸자는 여전히 (표준에 따라) 본문을 가지고 있어야하기 때문입니다. 정의되지 않은 부분은 순수 가상 멤버 함수 (정의가 없을 수도 있음)에 적용됩니다. – StoryTeller