Partilhar via


Aviso C26434

A função 'derived::function' oculta uma função não virtual 'base::function' (c.128).

Diretrizes principais do C++

C.128: As funções virtuais devem especificar exatamente uma das funções virtual, de substituição ou final

Observações

Quando você introduz uma função que tem o mesmo nome que uma função não virtual em uma classe base, você pode obter um comportamento inesperado. É como introduzir um nome de variável que entra em conflito com um nome de um escopo externo. Por exemplo, você pode ter pretendido substituir uma função de classe base. Se as assinaturas das funções não corresponderem, a substituição pretendida pode se transformar em uma sobrecarga. Em geral, a ocultação de nomes é perigosa e propensa a erros.

Nas Orientações Principais, verifica:

  • Somente as funções não prevalecentes na classe atual são verificadas.
  • Apenas as funções não virtuais das classes base são consideradas.
  • Nenhuma correspondência de assinatura é executada. Os avisos são emitidos se nomes não qualificados corresponderem.

Exemplo

Este exemplo demonstra como uma classe derivada pode ocultar funções não virtuais e como as funções virtuais permitem sobrecargas e substituições:

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