C ++의 순수한 가상 소멸자 A { public:

쓰는 것이 잘못입니까?

class A {
public:
    virtual ~A() = 0;
};

추상 기본 수업에 대한?

적어도 MSVC에서 컴파일됩니다 … 런타임에 충돌합니까?



답변

예. 또한 소멸자를 구현해야합니다.

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

충분해야합니다.

그리고 이것이 다운 투표권을 얻었으므로 분명히해야합니다 .A에서 무엇이든 파생하여 삭제하거나 파괴하려고 A하면 결국 소멸자가 호출됩니다. 순수하고 구현이 없으므로 정의되지 않은 동작이 발생합니다. 하나의 인기있는 플랫폼에서 purecall 핸들러를 호출하고 충돌합니다.

편집 : http://www.comeaucomputing.com/tryitout/으로 컴파일하여 선언을보다 적합하게 수정


답변

전용 소멸자 : 파생 클래스의 객체를 만들 때 그렇지 않으면 오류가 발생합니다. 그래도 진단이 나타날 수 있습니다.

12.4 소멸자

6 소멸자는 가상 (10.3) 또는 순수 가상 (10.4)으로 선언 될 수 있습니다. 해당 클래스의 객체 또는 파생 클래스가 프로그램에서 생성되면 소멸자가 정의됩니다.

순수한 가상 소멸자를 가진 클래스는 추상 클래스입니다. 잘 참고하십시오 :

10.4 추상 클래스

2 순수 가상 함수는 규정 된 ID 구문 (5.1)을 사용하여 호출하거나 (12.4) 호출하는 경우에만 정의해야합니다.

[ 참고 : 함수 선언은 순수 지정자와 정의를 제공 할 수 없습니다 — 종료 참고]

초안에서 바로 찍은 :

struct C {
   virtual void f() = 0 { }; // ill-formed
};