IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Redéfinition du méthode virtuel


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut Redéfinition du méthode virtuel
    Bonjour,

    Je voudrais avoir vos lumière quand à la nécessité du mot clé "virtual" lors de la redéfinition d'une méthode dans une classe dérivée. Dans le code développé par mon collègue, à certain moment, les méthodes virtuelles perde le mot clé "virtual" dans la déclaration. Comme la méthode test() dans l'exemple si dessous :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class A
    {
    public:
    	virtual void test()
    	{
    		std::cout << "test classe A" << std::endl;
    	}
    };
     
    class B : public A
    {
    public:
    	void test()
    	{
    		std::cout << "test classe B" << std::endl;
    	}
    };

    Mon collègue me soutient que cela n'a pas d'importance et que la méthode test() est bien surchargée.
    Je le site : "Le compilateur fait comme si le mot clé "virtual" était présent."
    En cherchant sur internet (google à été mon ami) j'ai eu des confirmations de cette règle (site MSDN et IBM) mais l'explication n'est pas très clair ?!

    Pourriez vous me confirmer s'il n'y a pas de risque à faire cela ? Quid du destructeur ?
    Personnellement, je ne m'était jamais poser cette question car j'écrivais toujours "virtual" lors de la surcharge d'une méthode "virtual".

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Pour une fonction donnée virtual se propage dans les différents niveaux de ton arbre d’héritage.

    Supposons qu'on ait 3 classes : A, B qui hérite publiquement de A, et C hérite publiquement qui de B.

    Avec une fonction foo déclarée virtuelle dans A, tu écris explicitement que cette fonction est un point de variation et que toute classe dérivée peut redéfinir
    le comportement de la fonction : ca concerne B, mais aussi C qui est aussi une classe dérivée (indirectement) de A et potentiellement une infinité d'autres classes .

    Si virtual ne se propageait pas, ca voudrait dire que B pourrait redéfinir le comportement de foo mais pas C ! Ca ne serait pas logique...
    Ca mache aussi pour le destructeur.
    Donc virtual se propage. On peut omettre le mot clé, mais je préfère le garder pour des questions de cohérence et de facilité de lecture.

    Virtual un jour, virtual toujours.
    Edit : Pour la référence
    C++ 2011: 10.3 Virtual Functions

    2: If a virtual member function vf is declared in a class Base and in a class Derived, derived directly or indirectly from Base, a member function vf with the same name, parameter-type-list, cv-qualification, and ref-qualifier (or absence of same) as Base::vf is declared, then Derived::vf is also virtual (whether or not it is so declared) ...

    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Ton collègue a tout à fait raison, et Davidbrcz t'a d'ailleurs donné la référence issue de la norme où c'est clairement dit.

    Cependant, on peut considérer qu'il est plus logique de remettre le mot clé virtual dans toutes les calsses dans lesquelles la fonction est redéfinie. Non pas pour que le compilateur sache que c'est bel et bien une fonction virtuelle, mais plutôt pour faciliter le travail du développeur.

    Car la règle veut que l'on ne redéfinisse que le comportement des fonctions virtuelles, si l'on veut éviter les problèmes. Mais, si on ne met pas le mot clé virtual dans la déclaration d'une fonction redéfinie, au niveau de la classe dérivée, la seule information qui permet au développeur se trouve... au niveau de la classe de base. Pour que le développeur sache qu'il peut effectivement redéfinir cette fonction dans une classe qui hériterait de la classe dérivée, il devrait alors aller voir le code de la classe de base, ce qui est finalement une perte de temps.

    Il est donc utile, pour le développeur, d'avoir le mot clé au niveau de la classe dérivée, même si ce n'est pas obligatoire. Disons juste que cela permet de rendre les choses plus claires pour tout le monde, et que cela facilite le travail de tout le monde
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Hello,
    Je pense qu'une bonne pratique (si on a accès à C++11) est d'utiliser le mot clé pour les méthode virtuelles qu'on redéfini. Je vois 2 avantages par rapport au mot clé 'virtual' optionnel :
    - ça permet de ne pas perdre le fil comme le disait Davidbrcz
    - mais aussi, tu auras un message d'erreur au moment de la compilation, si tu te trompe dans la signature de la méthode à redéfinir.

    edit:
    http://en.cppreference.com/w/cpp/language/override

  5. #5
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut
    Merci pour les réponses. En parallèle, j'ai essayé dans un projet simple pour essayer mais vos réponse sont plus complète. Je suppose que cela s'applique aussi au destructeur d'après l'extrait de la norme.

    Le mot clé "override" je ne connaissait pas ! En plus, j'y est accès avec mon compilateur (Visual Studio 2010).

    1. Quelqu'un connait un livre ou un site listant tous les nouveaux aspect de la norme C++ 11?
    2. Votre citation de la norme proviens d'un draft ou de la version finale ? Dans le second cas où l'avez vous eu ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Citation Envoyé par Kalite Voir le message
    1. Quelqu'un connait un livre ou un site listant tous les nouveaux aspect de la norme C++ 11?
    http://en.wikipedia.org/wiki/C%2B%2B11

    Sinon, il y aussi énormément d'infos sur http://isocpp.org/

    Edit:
    et pour savoir les features C++11 supportées par visual studio:
    http://msdn.microsoft.com/en-us/libr.../hh567368.aspx

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 22/03/2006, 10h49
  2. Méthodes virtuelle et implémentation
    Par slate dans le forum C++
    Réponses: 2
    Dernier message: 16/02/2006, 17h16
  3. méthodes virtuelles
    Par ep31 dans le forum C++
    Réponses: 2
    Dernier message: 09/11/2005, 17h21
  4. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 13h55
  5. [C#] Méthode virtuelle
    Par jacma dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/11/2004, 08h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo