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 :

Template et polymorphisme


Sujet :

Langage C++

  1. #1
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par défaut Template et polymorphisme
    Bonjour,

    j'ai la classe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <class CONTRACT_TYPE> class Referential
    {
    ...
    public:
    CONTRACT_TYPE * find(const string & marketId);
    ...
    }
    Et la classe suivante, avec toto une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class TitiReferential : public Referential<Titi>
    {
    ...
    public:
    Titi * find(const toto & marketId);
    ...
    }
    Lorsque j'utilise un objet de la classe TitiReferential , la méthode find de Referential n'est pas vu par le compilateur de visual c++. PAr contre si je l'appelle find2, ca marche !

    Pourquoi ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Parce que la fonction find que tu définis dans TitiReferential la masque (voir FAQ C++).
    Si la fonction de la classe de base a pour vocation d'être redéfinie dans les classes dérivées, alors peut-être doit-elle être virtuelle ? Si au contraire tu veux toujours utiliser les deux fonctions, alors il faut effectivement la nommer autrement (mais là ça sent le mauvais design).

  3. #3
    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
    C'est quoi "toto" ?

  4. #4
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par défaut
    Pour Laurent : tu confonds surdéfinition et polymorphisme

    Pour loufoque :

    typedef struct toto
    {
    int field1;
    int field2;
    int field3;
    int field4;
    int field5;
    } _toto;

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Si au contraire tu veux toujours utiliser les deux fonctions, alors il faut effectivement la nommer autrement (mais là ça sent le mauvais design).
    Je ne suis pas sûr que le désir de surcharger avec un membre d'une des classes de base soit signe d'un mauvais design. En tout cas, il suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using Referential<Titi>::find;
    dansTitiReferential. Note que le problème n'est en rien lié aux templates, tu l'aurais aussi bien avec deux classes normales.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour Laurent : tu confonds surdéfinition et polymorphisme
    Je ne suis pas sûr que le désir de surcharger avec un membre d'une des classes de base soit signe d'un mauvais design
    Désolé, j'avais loupé le paramètre de type différent ; je croyais qu'il s'agissait de deux fonctions aux prototypes identiques...

    typedef struct ... _toto;
    typedef struct est inutile en C++, et le préfixage par un underscore est normalement réservé.

  7. #7
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par défaut
    Pour Laurent : ... sauf si la structure vient d'une bibliothèque c qu'on est obligé d'utiliser.

    Pour Jean-Marc : merci, c'était bien ça. J'ignorais totalement la nécessité d'utiliser using dans ce cas là en c++. J'imagine que je n'ai pas encore eu l'occasion de rencontrer ce cas. On se demande pourquoi d'ailleurs, c'est automatique en java.

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par fabienpot
    On se demande pourquoi d'ailleurs
    C'est exactement le même raisonnement que dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace A {
       void f();
       namespace B {
          void f(int);
          int g() {
              f();  // B::f cache a::f
          }
       }
    }
    et c'est le même dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int f() {
       int i;
       {
          int i; // cache le i précédent
       }
    }
    C'est à dire que quand on a des scopes imbriqués, on ne cherche les noms dans le scope contenant que s'il n'a pas déjà été trouvé. C'est aussi une conséquence du fait que la résolution de surcharge s'opère en deux temps: collecte des candidats et résolution de surcharge.

    On aurait pû décider que le masquage concernait la signature plutôt que le nom, mais le C++ a évolué et dans un état antérieur, ça posait des problèmes. Ces problèmes potentiels n'existent plus depuis longtemps.

  9. #9
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par défaut
    c'est très clair.

    Merci.

    PS: il faut combien d'années d'XP en c++ pour maîtriser aussi bien que toi ?

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par fabienpot
    il faut combien d'années d'XP en c++ pour maîtriser aussi bien que toi ?
    Je ne sais pas ce qui est nécessaire. Mais si tu veux une idée de mon passé C++.

    Ma première approche du C++ a été vers 87, 88 quand j'ai emprunté la première édition du bouquin de Stroustrup à la bibliothèque universitaire, au moment ou j'ai dû emprunter tout le rayon qui concernait les langages. Je n'ai pas utilisé C++ alors. Ensuite vers 91 j'ai joué un peu avec CFront dans le cadre d'un projet qui était essentiellement écrit en C. Et en 92, 93 j'ai joué un peu avec borland C++. Mais jusque 97, mes langages principaux étaient le Turbo Pascal (jusque 93) et puis l'Ada. J'ai alors été engagé (pas pour mes connaissance en C++, pour mes connaissances dans le domaine) pour travailler sur un projet qui devait se mettre au C++. En prévision de ça pendant la période entre les deux contrats j'ai acheté la deuxième édition du bouquin de Stroustrup et j'ai fait joujou avec g++. En fait, ça ne m'a pas servi directement, il a fallu attendre 98, quand j'ai changé de société. Depuis lors je programme essentiellement en C++ et accessoirement en C de manière professionnelle.

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

Discussions similaires

  1. probleme template et polymorphisme
    Par thenewby dans le forum Langage
    Réponses: 9
    Dernier message: 16/07/2012, 16h48
  2. templates et polymorphisme
    Par mister3957 dans le forum C++
    Réponses: 9
    Dernier message: 01/04/2009, 16h59
  3. Template et Polymorphisme = contrainte ?
    Par poukill dans le forum Langage
    Réponses: 29
    Dernier message: 06/02/2008, 20h27
  4. template et polymorphisme
    Par new.proger dans le forum Langage
    Réponses: 14
    Dernier message: 28/08/2007, 00h35
  5. Template et polymorphisme
    Par Pierre_IPROS dans le forum Langage
    Réponses: 19
    Dernier message: 09/10/2005, 23h04

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