경고 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
};