C ++의 순수한 가상 소멸자


답변:


218

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

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

inline A::~A() { }

충분해야합니다.

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

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


16
음, 그렇습니다. 순수는 파생 클래스가 구현을 제공해야 함을 의미합니다.
MSN

72
순수한 가상 기능을 구현하는 것은 실제로 합법적입니다. 기본 구현을 제공하지만 서브 클래스에서 명시 적으로 호출하도록하는 데 매우 유용합니다.
jmucchiello 2016 년

6
MSN에서 헤더에 해당 정의가있는 경우 ODR (하나의 정의 규칙)을 위반하지 않도록하기 전에 "인라인"을 넣어야합니다.
Johannes Schaub-litb

2
모든 객체에 대해 기본 소멸자가 있다고 생각했기 때문에 A :: ~ A ()를 명시 적으로 정의해야하는 이유는 무엇입니까? 모든 유형의 상속과 마찬가지로 소멸자 체인이 항상 호출되며 기본 클래스 소멸자가 항상 정의 될 필요는 없습니다.
jeffD

11
더 좋은 방법은 소멸자를 선언하면 자동으로 구현되지 않는 것입니다.
MSN

49

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

12.4 소멸자

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

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

10.4 추상 클래스

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

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

초안에서 바로 찍은 :

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

14
+1. : 나는 허브 셔터는이에 대한 좋은 정보를 가지고 있다고 생각 gotw.ca/gotw/031.htm을 . 순수한 가상 함수에는 소멸자뿐만 아니라 구현이 제공 될 수 있습니다.
Fred Larson

6
네, 면접관을 놀라게하기 위해 인터뷰에서하는 일입니다.)
dirkgently

1
실제로 내 경험상 그렇게 드문 것은 아닙니다.

@ 닐 버터 워스 : 어느 것?
dirkgently 2016 년

@Dirk- "모든 기능"시나리오. 일반적인 행동을 구현하는 데 사용되는 것은 드문 일이 아닙니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.