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.