경고 C26436

가상 함수가 있는 'symbol' 형식에는 공용 가상 또는 보호된 비 가상 소멸자(c.35)가 필요합니다.

C++ 핵심 지침: C.35: 기본 클래스 소멸자가 공용 및 가상이거나 보호되고 비이상이어야 합니다.

클래스가 가상 함수를 정의하는 경우 파생 클래스가 리소스 관리 및 소멸 논리를 포함하여 동작을 변경할 수 있음을 의미하는 다형식이 됩니다. 클라이언트 코드는 기본 클래스에 대한 포인터를 통해 다형 형식을 호출할 수 있으므로 클라이언트가 다운캐스트 없이 적절한 동작을 명시적으로 선택할 수 있는 방법은 없습니다. 리소스가 일관되게 관리되고 실제 형식의 규칙에 따라 소멸이 발생하도록 하려면 공용 가상 소멸자를 정의해야 합니다. 형식 계층 구조가 개체를 직접 삭제하는 클라이언트 코드를 허용하지 않도록 설계된 경우 소멸자는 보호된 가상이 아닌 것으로 정의되어야 합니다.

설명

  • 경고는 형식당 한 번씩 형식의 첫 번째 가상 함수 정의(공용이 아닌 경우 가상 소멸자가 될 수 있음)에 표시됩니다.

  • 정의는 선언과 별도로 배치할 수 있으므로 항상 가상 지정자가 있는 것은 아닙니다. 그러나 경고는 여전히 유효합니다. 함수의 실제 '가상성'을 검사.

코드 분석 이름: NEED_VIRTUAL_DTOR

예시

namespace no_destructor
{
    struct base {
        virtual void foo() {} // C26436, see remarks to understand the placement of the warning.
    };
}

기본 클래스에 가상 공용 소멸자 또는 보호된 비 가상 소멸자가 있는 경우 경고가 나타나지 않습니다.

namespace virtual_destructor
{
    struct base {
        virtual ~base();
        virtual void foo() {}
    };
}
namespace protected_destructor
{
    struct base {
        virtual void foo() {}
    protected:
        ~base() {}
    };
}