2012-12-05 4 views
6

추상 기본 클래스에 멤버 변수 만 있지만 (멤버 메서드가없는) 클래스 상속 구조를 설정해야합니다. 멤버 메소드는 파생 클래스에 의해 정의됩니다. 따라서, 내가 필요로하는 것은이 게시물 수 있습니다 :protected constructor 대 순수 가상 소멸자

두 방법의 차이점을 알고 싶습니다. 다른 시나리오보다 선호해야하는 시나리오가 있습니까 (아니면 작동하지 않는 특수한 상황 일 수도 있습니다). 나는 그것에 대해 생각하고 아무것도 생각할 수 없었다.

내가 뭔가를 함께 넣어하려고 여기에 몇 가지 게시물 (Is there a use for making a protected destructor virtual?, C++: Protected Class Constructor, Should an abstract class' destructor be pure virtual?)에 대한 답변을 통해 검색,하지만 난 결론에 도달 할 수 없었다.

답변

3

가장 큰 차이점은 UB가있을 것없이 가상 소멸자와

Base * ptr = new Derived; 
delete ptr; 

에이 법률이다. 또한 dynamic_cast에는 하나 이상의 가상 기능이 필요합니다.
그래서 다형성 동작을 원한다면 (순수한) 가상 소멸자를 사용하십시오. 원하지 않으면 보호 된 생성자를 사용하고 다형성 (vtable)에 대한 오버 헤드를 지불하지 않습니다. 그런 다음 기본 포인터를 통해 삭제를 방지하기 위해 보호 된 소멸자도 선언하십시오.

+1

이것은 OP의 질문에 * 정말로 * 답하지 않습니다. 비 순수 가상 소멸자는 보호 된 생성자 사례와 함께 사용할 수 있으며 예제 코드는 정의 된 동작을 나타냅니다. 관련이 있지만 직각 이슈에 대해 이야기하고 있습니다. –

3

두 가지 방법 모두 완전히 다른 메커니즘을 사용하여 원하는 효과를 얻을 수 있습니다. 제 의견으로는 protected constructor이 문제 설명과 정확하게 일치하기 때문에 더욱 표현력이 좋습니다. Pure virtual destructor은 자연적인 해결책이 아니며 그 목적을 설명하기 위해 추가 문서가 필요할 수 있습니다. 또한 건너 뛸 수있는 경우에도 하위 클래스가 소멸자를 구현하도록합니다.

+0

파생 클래스에서 소멸자를 명시 적으로 구현하지 않으면 해당 클래스에 대해 자동으로 생성 된 소멸자로 충분하다고 읽었습니다. 따라서 순수 가상 소멸자는 하위 클래스가 소멸자를 구현하도록 강요하지 않습니다. – Wutz

+0

@Wutz, 그 때 목적은 무엇입니까? –

+0

@Michael Krelin - 해커 : 순수 가상 메서드없이 기본 클래스 추상 만들기. 기본 클래스가 가상 메소드의 기본 구현을 정의하고 직접 구현되지 못하도록하는 데 유용 할 수 있습니다. – Wutz