Avviso C26434
La funzione 'derived::function' nasconde una funzione non virtuale 'base::function' (c.128).
Linee guida di base di C++
Osservazioni:
Quando si introduce una funzione con lo stesso nome di una funzione non virtuale in una classe di base, è possibile che si verifichi un comportamento imprevisto. È come introdurre un nome di variabile in conflitto con un nome da un ambito esterno. Ad esempio, potrebbe essere necessario eseguire l'override di una funzione della classe di base. Se le firme delle funzioni non corrispondono, l'override previsto può invece trasformarsi in un overload. In generale, il nome nascosto è pericoloso e soggetto a errori.
Nei controlli delle linee guida di base:
- Vengono controllate solo le funzioni non di override nella classe corrente.
- Vengono considerate solo le funzioni non virtuali delle classi di base.
- Non viene eseguita alcuna corrispondenza di firma. Gli avvisi vengono generati se i nomi non qualificati corrispondono.
Esempio
Questo esempio illustra come una classe derivata può nascondere funzioni non virtuali e come le funzioni virtuali consentono sia overload che sostituzioni:
// 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
};