Compartilhar via


Aviso C26434

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

Diretrizes Principais do C++

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

Comentários

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, talvez você tenha a intenção de substituir uma função de classe base. Se as assinaturas das funções não corresponderem, a substituição pretendida poderá se tornar uma sobrecarga. Em geral, ocultar nomes é perigoso e propenso a erros.

Nas verificações das Diretrizes Principais:

  • Somente funções não substituídas na classe atual são verificadas.
  • Somente funções não virtuais de classes base são consideradas.
  • Nenhuma correspondência de assinatura é executada. Os avisos serã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
};