Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A função 'derived::function' oculta uma função não virtual 'base::function' (c.128).
Diretrizes principais do C++
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
};