C26435 SINGLE_VIRTUAL_SPECIFICATIONC26435 SINGLE_VIRTUAL_SPECIFICATION

« Fonction doit spécifier un seul 'Virtual', 'override' ou 'final'. »“Function should specify exactly one of 'virtual', 'override', or 'final'.”

C++ Core GuidelinesC++ Core Guidelines

C.128 : Les fonctions virtuelles doivent spécifier un seul de virtuel, substitution, ou finalC.128: Virtual functions should specify exactly one of virtual, override, or final

Pour améliorer la lisibilité du type de comportement virtuel doit être établi clairement et sans redondance inutile.To improve readability the kind of virtual behavior should be stated clearly and without unnecessary redundancy. Même si les spécificateurs virtuels peuvent être utilisés simultanément, il est préférable de spécifier qu’une seule à la fois pour mettre en évidence l’aspect le plus important de comportement virtuel.Even though virtual specifiers can be used simultaneously, it is better to specify one at a time to emphasize the most important aspect of virtual behavior. L’ordre d’importance suivant est évident :The following order of importance is apparent:

  • fonction virtuelle ordinaire ;plain virtual function;
  • fonction virtuelle qui remplace explicitement sa base ;virtual function which explicitly overrides its base;
  • fonction virtuelle qui se substitue à sa base et fournit l’implémentation finale dans la chaîne d’héritage actuelle.virtual function which overrides its base and provides the final implementation in current inheritance chain.

NotesNotes

  • Cette règle ignore les destructeurs, car elles ont des règles particulières régissent virtuality.This rule skips destructors since they have special rules regarding virtuality.
  • Avertissements s’affichent dans les définitions de fonction, pas de déclarations.Warnings show up on function definitions, not declarations. Cela peut prêter à confusion, car les définitions n’ont pas les spécificateurs virtuels, mais l’avertissement est toujours légitime.This may be confusing since definitions do not have virtual specifiers, but the warning is still legitimate.

Exemple : Spécificateur redondantExample: Redundant specifier

class Ellipse : public Shape {
public:
    void Draw() override {
        //...
    }
};

class Circle : public Ellipse {
public:
    void Draw() override final { // C26435, only 'final' is necessary.
        //...
    }
};

Voir aussiSee Also

C.128 : Les fonctions virtuelles doivent spécifier un seul de virtuel, substitution, ou finalC.128: Virtual functions should specify exactly one of virtual, override, or final