경고 C26434

'derived::function' 함수는 가상이 아닌 함수 'base::function'(c.128)을 숨깁니다.

C++ Core Guidelines

C.128: 가상 함수는 가상, 재정의 또는 최종 중 하나를 정확히 지정해야 합니다.

설명

기본 클래스에서 가상이 아닌 함수와 이름이 같은 함수를 도입하면 예기치 않은 동작이 발생할 수 있습니다. 외부 범위의 이름과 충돌하는 변수 이름을 도입하는 것과 같습니다. 예를 들어 기본 클래스 함수를 재정의하려고 했을 수 있습니다. 함수의 서명이 일치하지 않으면 의도한 재정의가 대신 오버로드로 바뀔 수 있습니다. 일반적으로 이름 숨기기는 위험하고 오류가 발생하기 쉽습니다.

핵심 지침 검사:

  • 현재 클래스의 재정의되지 않은 함수만 검사.
  • 기본 클래스의 가상이 아닌 함수만 고려됩니다.
  • 서명 일치가 수행되지 않습니다. 정규화되지 않은 이름이 일치하면 경고가 내보내집니다.

예시

이 예제에서는 파생 클래스가 가상이 아닌 함수를 숨길 수 있는 방법과 가상 함수가 오버로드 및 재정의를 모두 허용하는 방법을 보여 줍니다.

// C26434.cpp
struct Base
{
    virtual ~Base() = default;
    virtual void is_virtual() noexcept {}
    void not_virtual() noexcept {}
};

struct Derived : Base
{
    void is_virtual() noexcept override {}      // Okay, override existing function
    virtual void is_virtual(int i) noexcept {}  // Add a virtual overload for function
    void not_virtual() noexcept {}              // C26434, hides a non-virtual function
    virtual void not_virtual(int i) noexcept {} // C26434, and parameters ignored
};