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

Langage C++ Discussion :

Virtual et Template : éclairez-moi !


Sujet :

Langage C++

  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut Virtual et Template : éclairez-moi !
    Bonjour tout le monde !
    J'ai un classe qui contient des méthodes "protected" déclarées ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      virtual Void F1( UChar *p1, UChar *p2, int n);
    ...
    void F1( short *p1, short *p2, int n);
    Ma question est que j'aimerais spécialiser la fonction F1 en fonction d'un paramètre (ici, n) et j'ai pensé aux templates, évidemment.
    Ceci dit, le virtual me pose problème !

    Comment faire ?
    Merci d'avance !

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Ce n'est pas possible de faire des fonctions membres à la fois virtuelle et template. C'est con mais c'est comme ça.

    Voici 2 suggestions qui peuvent peut-être te convenir:

    - une classe template avec des fonctions virtuelles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<class T>
    struct A
    {
      virtual void f() const;
    };
    -une fonction template globale "virtuelle":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct A { virtual void f() const; };
    template<class T> f(const A &a, T x) { ... a.f(); ... }

  3. #3
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    C'est con effectivement !
    Eh bien, merci de ta réponse, ça m'évite de me prendre la tête à essayer de comprendre ce qui ne va pas .

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    C'est con, mais ça peut se comprendre. Pour implémenter le mécanisme de fonctions virtuelle, on crée généralement un tableau contenant des pointeurs vers toutes celles-ci. Si cette fonction est un template, il y a potentiellement un nombre infini de fonctions virtuelles dans la classe, et le nombre dépend des utilisateurs de celle-ci. Comment donc construire un tel tableau ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    OK, et puis finalement, en creusant, le virtual est superflu ! .
    Mais j'aurais au moins compris quelque chose .

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par progfou
    OK, et puis finalement, en creusant, le virtual est superflu ! .
    Mais j'aurais au moins compris quelque chose .
    Sans le virtual, la liaison sera statique et non pas dynamique. Si des personnes héritent plus tard (même beaucoup plus tard) de tes classes, le fait de trouver des fonctions non virtuelles qu'ils auraient bien aimés réimplanter est dommageable...
    Evidemment, la liaison statique est toujours au moins aussi rapide que la liaison dynamique!

    J'aurai tendance à dire que, moins il y a de virtual, plus le programme s'éloigne de l'orienté objet "pur"...
    Dans Java, la liaison est toujours dynamique, au risque c'est vrai, de perde un peu en rapidité.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je ne connais pas le sujet en question (des noms comme F1, p1... ne sont pas très descriptifs), et donc je ne peux pas juger si l'utilisation d'un lien statique est approprié ou non. Par contre, je récuse le concept de "pureté" comme critère de conception.

    Le choix de tout avoir en dynamique me semble généralement une erreur, et introduit une complexité de code, de documentation et de tests énorme (après tout, si une fonction est virtuelle, il faut avoir prévu qu'elle puisse être remplacée, avoir documenté en détail comment elle est sensée être remplacée, et avoir testé que son remplacement fonctionne comme prévu), pour un gain hypothétique et très faible.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par JolyLoic
    Le choix de tout avoir en dynamique me semble généralement une erreur, et introduit une complexité de code, de documentation et de tests énorme (après tout, si une fonction est virtuelle, il faut avoir prévu qu'elle puisse être remplacée, avoir documenté en détail comment elle est sensée être remplacée, et avoir testé que son remplacement fonctionne comme prévu), pour un gain hypothétique et très faible.
    En même temps si on fait des tests unitaires (avec des 'mock objects') on tombe très vite dans une vision complètement inverse :
    . une classe concrète qui ne dépend que d'interfaces (classe avec uniquement des méthodes virtuelles pures) est une classe facile à tester unitairement
    . la flexibilité est énorme : pour ajouter une fonctionnalité il n'y a souvent pas besoin de changer du code, on peut insérer plus facilement des nouveaux objets dans le système (éventuellement en 'proxies', 'décorateurs', etc.. d'objets existants)
    . les créations sont centralisées : une classe concrète ne crée aucun objet concret à moins d'être une 'factory' (très peu de code, en général juste un new) ou le 'main' (ou MainWindow ou etc..) qui se contente de créer les objets de haut niveau et de configurer les uns avec les autres
    . on aboutit à une vision beaucoup plus haut niveau : on compose des objets entre eux
    . les tests sont la documentation utilisateur

    Bon je m'embale vite sur ce sujet mais c'est l'idée, et depuis ce déclic ma vie c'est le bonheur

    MAT.
    (viva TDD !)

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Comment donc construire un tel tableau ?
    Il suffit de le construire au moment de l'édition de liens.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    On laisse donc tomber la compilation séparée. Ou les bibliothèques dynamiques.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Je comprends le problème pour un compilo de déclarer une fonction comme étant à la fois virtuelle et template.
    C'est dommage que ça marche pas.
    Mais j'imagine que c'est quand même théoriquement envisageable, mais si j'ai pas trop envie de creuser comment. De toute façon on n'y changera rien.

    Perso j'utilise à peine les fonctions virtuelles, je lui préfère de très loin le polymorphisme statique (avec des templates) genre STL. Ca dépend du problème et c'est pas toujours envisageable. Mais je me souviens de d'implémentations de containers (des listes par exemple) basées uniquement sur le polymorphisme virtuel (MFC, java...), je voudrais pour rien au monde troquer la STL contre 100 barils de MFC.

    Et puis je ne suis pas d'accord avec ceux qui disent que les fonctions virtuelles perdent un peu en rapidité. Cette affirmation n'est valable que si on considère le temps d'exécution de la fonction. Et ce serait vrai par exemple pour une implémentation d'un GUI, ou le temps d'appel des fonctions est négligeable, et dans ce cas on aurait probablement tord de se priver de l'utilité des fonctions virtuelles.
    J'estime qu'il vaut mieux comparer uniquement les temps d'appels aux fonctions. Sans les avoir mesurer, je considère que le temps d'appel des fonctions statiques est nettement plus rapide:
    -moins d'instructions nécessaires au processeur
    -ne brise pas le pipeline
    -pas d'accès mémoire (sur le tableau virtuel)
    -potentiellement inline
    Bref je considère que pour les calculs numériques les fonctions virtuelles sont à proscrire. Et je m'en passe très bien...

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

Discussions similaires

  1. pure virtual method et templated return type
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 21/08/2014, 12h57
  2. HyperV / VirtualBox éclairez moi svp
    Par Invité dans le forum Virtualisation
    Réponses: 3
    Dernier message: 23/09/2013, 23h08
  3. héritage template virtual destructeur
    Par ziker dans le forum Langage
    Réponses: 7
    Dernier message: 26/11/2011, 20h27
  4. [XSLT] template
    Par demo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/09/2002, 11h31
  5. Abstract VS virtual
    Par LE CHAKAL dans le forum Langage
    Réponses: 2
    Dernier message: 29/08/2002, 17h50

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