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 :

Les fonctions virtuelles en C++ [Tutoriel]


Sujet :

C++

  1. #1
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut Les fonctions virtuelles en C++
    Bonjour,
    Je vous propose un article sur les fonctions virtuelles en C++.
    En voici le synopsis :
    Les fonctions virtuelles sont un des piliers de la programmation orientée objet. En favorisant l'abstraction, elles permettent la construction d'architectures logicielles stables et évolutives. Cet article se propose d'explorer les fonctions virtuelles dans le langage C++ en abordant aussi bien les problèmes syntaxiques que les conséquences sémantiques de leur utilisation.
    Vous pouvez consulter l'article en version une seule page ou plusieurs pages.
    N'hésitez pas à apporter remarques, conseils, critiques...

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Cet article est tout simplement excellent !

    Tout est expliqué clairement, avec des exemples.

    A conseiller aux débutants ainsi qu'à tous ceux qui, comme moi, ont besoin d'une piqûre de rappel de temps en temps.

    En tout cas, merci pour l'article !

  3. #3
    Membre régulier Avatar de thoratou
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 116
    Points
    116
    Par défaut
    Tout a fait d'accord avec white_tentacle, c'est tout simplement excellent.

    Par contre pourquoi appelles-tu ca "fonction" et non pas "methode" ?
    Screen (SCalable REndering ENgine) : moteur 3d en développement

    There are only two things wrong with C++: The initial concept and the
    implementation.
    Bertrand Meyer

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par white_tentacle Voir le message
    Cet article est tout simplement excellent !
    Citation Envoyé par thoratou Voir le message
    Tout a fait d'accord avec white_tentacle, c'est tout simplement excellent.



    Citation Envoyé par thoratou Voir le message
    Par contre pourquoi appelles-tu ca "fonction" et non pas "methode" ?
    Je ne suis pas sûr que tout le monde s'accorde sur la définition de méthode. On le trouve parfois employé pour désigner les fonctions membres d'une classe (virtuelles ou non). Il me semble que Stroustrup n'emploie le mot méthode que pour les fonctions virtuelles[*], c'est à dire dont la résolution de l'appel est lié à un type dynamique (et dont je crois qu'il avait proposé à un moment qu'elles soient en dehors des classes). Il m'a semblé plus compréhensible de s'en tenir au mot 'fonction'.

    [EDIT][*] Dans cet article : multimethods.
    “Method” is a common term for a function chosen through runtime polymorphic dispatch.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    Les classes dérivées devraient utiliser le mot-clé virtual pour les fonctions définies comme virtuelles dans la classe de base.
    On ne le dit jamais assez. Et là c'est bien de le souligner.

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Dans la bible, on trouve un glossaire où il définit/rappelle que méthode est un autre terme pour fonction virtuelle chez beaucoup.
    D'où que mieux vaut l'éviter et s'en tenir au vocabulaire officiel pour être précis.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    J'ai envie de dire que c'est un peu massif.

    Tu devrais rajouter quelques points résumées à la fin des parties, ce serait plus digeste je penses.

    Mais sinon, très bon article. Peut-être devrais-tu ajouter une partie sur la façon dont cela est implémenté en pratique, comment sont géré résolus les appels à l'exécution, comment est géré l'héritage multiple, etc . . .

    Enfin, c'est des voies à explorer pour améliorer l'article, mais il est déjà de bonne qualité.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par deadalnix Voir le message
    J'ai envie de dire que c'est un peu massif.
    J'ai essayé de bien couvrir la chose. Mais rassures-toi, il existe encore beaucoup de chose à dire
    Citation Envoyé par deadalnix Voir le message
    Tu devrais rajouter quelques points résumées à la fin des parties, ce serait plus digeste je penses.
    En fait, j'ai rajouté à la fin de l'article un ensemble de chose qui m'ont parues importantes à retenir : XXIV. A retenir
    Citation Envoyé par deadalnix Voir le message
    Peut-être devrais-tu ajouter une partie sur la façon dont cela est implémenté en pratique, comment sont géré résolus les appels à l'exécution, comment est géré l'héritage multiple, etc . . .
    Comme la partie : XXIII. Comment ça marche ?
    (d'ailleurs, je me rend compte qu'il y a des erreurs, je va corriger de suite)

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    (d'ailleurs, je me rend compte qu'il y a des erreurs, je va corriger de suite)
    La partie qui commence avec la phrase
    Lorsque l'arbre d'héritage devient complexe, notamment en présence d'héritage virtuel, les compilateurs peuvent varier en regroupant certaines tables. Ce n'est pas le cas de tous. Ainsi, dans l'exemple suivant, Visual et GCC diffèrent légèrement :
    jusqu'à
    Visual C++ génère une redondance (mais le compilateur est certainement plus facile) :
    est fausse. Le problème lié à l'héritage virtuel est différent. Je corrige et mettrais à jour ensuite. En attendant, j'ai supprimé cette partie pour ne pas créer d'ambigüité.
    Merci.

  10. #10
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Très bon article ! Toutefois, la partie "comment ça marche" est un peu brève... Je m'attendais pour tout dire à trouver plus d'explication sur les vtables et les vtt (un peu comme ).

    Réflexion faite, ton article est déjà assez long comme ça >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par Lavock Voir le message
    Je m'attendais pour tout dire à trouver plus d'explication sur les vtables et les vtt (un peu comme ).
    C'est la partie que je suis en train de réécrire car j'avais précédemment dit des bêtises et m'en suit rendu compte que trop tard.

  12. #12
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Excellent article 3DArchi .... vraiment top et que je m'empresserais de diffusé :p. Sérieusement je suis comme White_tentacle même si c'est des notions que je maîtrise une piqûre de rappelle fait toujours du bien... et c'est très bien expliqué. (abordable très tôt dans la formation amha).
    Certes c'est long, mais ça le vaut, surtout que c'est aéré et plein d'exemples donc ça se lit bien .


    Juste une petite remarque en passant, sur tout le paragraphe sur la spécifications d'exception j'aurais rappelé que c'est quand même pas une pratique recommandée.... (tu l'as fait pour d'autre chose il me semble).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    En fait, j'ai rajouté à la fin de l'article un ensemble de chose qui m'ont parues importantes à retenir : XXIV. A retenir
    Pour le reste, les autres ont explicité mon idée, donc je ne vais pas en rajouter.

    Sur ce point, je trouve cette partie décevante. Un petit paragraphe expliquant de quoi il retourne en bref est en général une très conne chose pour que le néophite digère les infos.

    Quand tu est nouveau dans un domaine, tu ne sais souvent pas ce qui est important de ce qui ne l'est pas. Il est donc important de repréciser dans chaque partie les ponts clef.

    Par exemple : « une fonction virtuelle est une fonction qui peut-être redéfinie dans une classe fille ».

    Si ceci est largement incomplet, et n'est donc pas un article de qualité, il attire l'attention de celui qui lit sur le point important. Il me semble utile de repréciser quelques points clef à la fin de chaque partie afin de permettre à un lecteur néophite de faire le tri entre l'idée générale, et les cas particuliers (masquage d'une fonction par une fonction virtuelle, fonction virtuelles amies, etc . . .).

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par deadalnix Voir le message
    Sur ce point, je trouve cette partie décevante. Un petit paragraphe expliquant de quoi il retourne en bref est en général une très conne chose pour que le néophite digère les infos.
    Lapsus révélateur

    Plus sérieusement, c'est peut être un problème de mise en forme. Si tu regardes bien, chaque chapitre ou presque contient une ou des phrases mises en relief avec une image d'information. Peut-être que cela ne les mets pas suffisamment en avant dans la section courante. Je vais réfléchir à ce que tu dis et voir comment mieux mettre en avant l'idée forte de chaque chapitre.

  15. #15
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    au cas où ça soit passez à l'as, je réitère ce que j'ai dis sur la spécification d'exception :p
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  16. #16
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Goten Voir le message
    au cas où ça soit passez à l'as, je réitère ce que j'ai dis sur la spécification d'exception :p
    No soucy. J'ai noté ça dans un petit coin.

  17. #17
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Très bon article, juste une remarque pourquoi utilisé le mot 'struct' pour déclaré tes classes? Je pense que cela peut être déroutant pour un débutant (surtout si il vient du monde java/C#)
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  18. #18
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par themadmax Voir le message
    Très bon article, juste une remarque pourquoi utilisé le mot 'struct' pour déclaré tes classes? Je pense que cela peut être déroutant pour un débutant (surtout si il vient du monde java/C#)
    Par fainéantise est certainement une mauvaise raison mais la bonne . En C++, struct et class sont équivalent si ce n'est les visiblités par défauts (publiques dans un cas, privées dans l'autre). Cela permet de faire des codes exemples plus concis. Remarque que la première note de bas de page fait le point là-dessus :
    Dans cet article, les termes classes et structures sont employés indifféremment. En effet, la seule différence en ce qui nous concerne entre class et struct est la visibilité par défaut : publique pour les membres et l'héritage pour les types définis avec struct et privée pour les membres et l'héritage pour les types définis avec class. Pour tous ce que nous allons dire par la suite, la chose est strictement identique que le type soit struct ou class. Cf. F.A.Q. : faq Quelle est la différence entre class et struct ?
    Disons que comme ça, ils sont directement plongés dans le bain du C++

  19. #19
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    J'ai une préférence pour struct pour ce genre de petit snaptest .
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

Discussions similaires

  1. Question sur les fonctions virtuelles
    Par beegees dans le forum C++
    Réponses: 9
    Dernier message: 13/04/2008, 19h54
  2. Bug sur les fonctions virtuelles
    Par Anthony.Desvernois dans le forum C++
    Réponses: 4
    Dernier message: 28/01/2008, 17h30
  3. Réponses: 2
    Dernier message: 07/10/2004, 17h00

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