2011-04-10 2 views
9

나는 추상적 인 기본 클래스의 여러 레이어와 다소 깊은 객체 지향 코드를 작성하는 시나리오가있어, 각각에 대한 소멸자를 명시 적으로 선언해야하는지 궁금 하네.가상 소멸자의 경우 각 서브 클래스에 가상 소멸자를 명시 적으로 선언해야합니까?

컴파일러가 이미 가상의 기본값을 생성합니까, 아니면 그 사실을 말해야합니까?

+0

아래의 주석에서 각 하위 클래스에 대해 소멸자를 _define_해야하는지 여부를 묻습니다. 그리고 대답은 '아니오'입니다. –

답변

9

기본 소멸자는 가상이 아닙니다.하지만 기본 클래스의 소멸자를 가상으로 선언하면 하위 클래스의 소멸자가 재정의되어 명시 적으로 선언되지 않아도 가상이됩니다.

GNU GCC 컴파일러는 클래스 계층 구조가 있고 기본 클래스가 소멸자를 가상으로 선언하지 않을 가능성이 높기 때문에 경고를냅니다.

+2

아마도 생성자가 아니라 소멸자를 의미했을 것입니다. – GManNickG

+0

오른쪽, 고마워요. – trenki

+1

gcc는 가상 메소드 *를 가지고 있지만 소멸자가 가상이 아닌 경우에만 경고를 발행합니다. 가상 메소드 없이도 클래스에서 완벽하게 상속받을 수 있습니다. 이는 메타 프로그래밍에 편리합니다. :) –

2

일반적으로 일부 함수가 기본 클래스에서 가상으로 선언 된 경우 명시 적으로 가상 클래스를 하위 클래스에 가상으로 선언 할 필요가 없습니다. 그러나 좋은 연습입니다.

서브 클래스의 소멸자를 가상으로 명시 적으로 선언해도 큰 이점이 없으므로 가상의 하나를 작성하지 않을 경우 그렇게하지 마십시오.

+0

구현에 정의를 포함해야합니까? 그 결과 많은 비어있는 소멸자가 제 코드를 혼란스럽게 할 것입니다. – Alex

+0

@Alex 아니요, 건너 뛸 수 있습니다. – UmmaGumma

3

대답은 '아니오'입니다. 여기서 유일한 관련 요구 사항은 vtable (, 즉, 하나 이상의 가상 함수 포함)이있는 클래스가 상속 체인 어딘가에 하나 이상의 가상 소멸자를 가져야한다는 것입니다. 일반적으로 기본 기본 클래스는 빈 가상 소멸자를 제공합니다.

관련 문제