Advertencia C26434
La función 'derived::function' oculta una función no virtual 'base::function' (c.128).
C++ Core Guidelines
Comentarios
Al introducir una función con el mismo nombre que una función no virtual en una clase base, puede recibir un comportamiento inesperado. Es como introducir un nombre de variable que entra en conflicto con un nombre de un ámbito externo. Por ejemplo, puede que haya pensado en invalidar una función de clase base. Si las signaturas de las funciones no coinciden, la invalidación prevista puede convertirse en una sobrecarga. En general, la ocultación de nombres es peligrosa y propensa a errores.
En las comprobaciones de Core Guidelines:
- Solo se comprueban las funciones no invalidadas de la clase actual.
- Solo se tienen en cuenta las funciones no virtuales de las clases base.
- No se realiza ninguna coincidencia de signaturas. Se emiten advertencias si los nombres no calificados coinciden.
Ejemplo
En este ejemplo se muestra cómo una clase derivada puede ocultar funciones no virtuales y cómo las funciones virtuales permiten sobrecargas e invalidaciones:
// 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
};