Compartir vía


Advertencia C26434

La función 'derived::function' oculta una función no virtual 'base::function' (c.128).

C++ Core Guidelines

C.128: Las funciones virtuales deben especificar exactamente uno de los valores siguientes: "virtual", "override" o "final"

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