Question

En parcourant un ancien code, je suis tombé sur un objet similaire à celui-ci:

class Base
{
public:
    virtual int Func();
    ...
};

class Derived : public Base
{
public:
    int Func(); // Missing 'virtual' qualifier
    ...
};

Le code est bien compilé (MS VS2008) sans avertissements (niveau 4) et il fonctionne comme prévu - Func est virtuel même si le qualificatif virtuel est manquant dans la classe dérivée. Maintenant, outre le fait de semer la confusion, existe-t-il un danger avec ce code ou dois-je tout changer en ajoutant le qualificatif virtual ?

Était-ce utile?

La solution

Le virtual sera appliqué à toutes les fonctions prioritaires dans les classes dérivées. Le seul avantage réel de l'ajout du mot-clé est de signifier votre intention, un observateur occasionnel de la définition de classe dérivée saura immédiatement que Func est virtuel.

Même les classes qui étendent Derived auront des méthodes Func virtuelles.

Référence: Fonctions virtuelles sur MSDN. Faites défiler la page pour voir

  

Le mot clé virtuel peut être utilisé lorsque   déclarer des fonctions de priorité dans un   classe dérivée, mais c'est inutile;   les remplacements de fonctions virtuelles sont   toujours virtuel.

Autres conseils

Voici une conséquence intéressante de ne pas avoir besoin de déclarer des fonctions prioritaires virtuelles:

template <typename Base>
struct Derived : Base
{
    void f();
};

Le caractère virtuel de f de Derived dépend de son instanciation avec une base avec une fonction virtuelle f de la signature de droite.

Quelqu'un m'a dit une fois que de très vieux compilateurs C ++, ne se conformant pas à la spécification, exigent que le virtuel soit défini pour toutes les sous-classes. Ce n'est plus un problème.

Un danger de suivre cette pratique est que les gens peuvent ne pas se rendre compte qu’ils ont besoin du mot clé virtuel sur les fonctions qui sont censées être virtuelles. C’est très probablement des personnes venant de langues où il n’existe pas de concept de fonctions non virtuelles (par exemple: Java, REALbasic). En corollaire, vous ne pouvez pas savoir quand le virtuel a été délibérément omis car une fonction est supposée être non virtuelle.

Je pense que certains outils d'analyse de code peuvent également ne pas être assez intelligents pour exploiter la virtualité héritée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top