Partager via


Avertissement C26434

La fonction 'derived ::function' masque une fonction non virtuelle 'base ::function' (c.128).

C++ Core Guidelines

C.128 : Les fonctions virtuelles doivent spécifier exactement l’une des fonctions virtuelles, remplacées ou finales

Notes

Lorsque vous introduisez une fonction portant le même nom qu’une fonction non virtuelle dans une classe de base, vous pouvez obtenir un comportement inattendu. Il est semblable à l’introduction d’un nom de variable qui est en conflit avec un nom d’une étendue externe. Par exemple, vous avez peut-être l’intention de remplacer une fonction de classe de base. Si les signatures des fonctions ne correspondent pas, le remplacement prévu peut se transformer en surcharge à la place. En général, le masquage de nom est dangereux et sujette aux erreurs.

Dans les vérifications principales des instructions :

  • Seules les fonctions non substituées dans la classe actuelle sont vérifiées.
  • Seules les fonctions non virtuelles des classes de base sont prises en compte.
  • Aucune correspondance de signature n’est effectuée. Les avertissements sont émis si les noms non qualifiés correspondent.

Exemple

Cet exemple montre comment une classe dérivée peut masquer des fonctions non virtuelles et comment les fonctions virtuelles autorisent les surcharges et les substitutions :

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