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 :

Héritage d'une classe template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Par défaut Héritage d'une classe template
    Bonjour à tous,

    Ma question est simple. Considérez le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    template <class Type>
    class Mere
    {
       /* ... */
    };
     
    class Data
    {
       /* ... */      
    };
     
    class Fille : public Mere<Data>
    {
       /* ... */     
    };
    Le code compile parfaitement mais je n'ai jamais eu l'occasion de rencontrer ce type d'implémentation (ou alors j'ai oublié) et j'aimerais simplement savoir si ce genre de code est portable

    Merci d'avance!

  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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Pourquoi en serait 'il pas portable.
    C'est du C++, pas plus pas moins.
    "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
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Si je ne m'abuse, tous les compilateurs connus supportent ce mécanisme.
    Si de plus la classe fille est template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <typename T> class Mere { /* ... */ };
    template <typename T> class Fille : public Mere<T>
    { /* ... */ };
    on appelle ça le CRTP.

    C'est très utilisé, notamment de manière combinée aux classes de politique.

  4. #4
    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
    Plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template <typename T> class Mere { /* ... */ };
    class Fille : public Mere<Fille> { /* ... */ };
    en fait le CRTP. Mais je n'ai jamais eu l'occasion de l'utiliser! Trop compliqué pour moi !

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Oula, oui, désolé.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    En fait, le CRTP, bien que complexe, est malgré tout utile quand tu es sur qu'un certain nombre de classes (non template) vont présenter des comportements exactement identiques quels que soient les types de données réellement utilisés, mais que tu n'envisage pas de mettre en oeuvre le polymorphisme.

    Un autre avantage est de permettre, par exemple, à des membres statiques, définis dans la classe de base, d'être malgré tout d'être définis pour chaque type existant.

    Ainsi, on peut se rappeler que dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Base
    {
        /*...*/
        protected:
            static UnType membre;
    };
    class Derive : public Base
    {
        /*...*/
    };
    class Derivee2 : public Base
    {
        /*...*/
    };
    toutes les variables qui sont de type Base, Derivee ou Derivee2 partageront le même membre, alors que, dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    template <class T>
    class Base
    {
        /*...*/
        protected:
            static UnType mbre;
    };
    class Derive : public Base<Truc>
    {
        /*...*/
    };
    class Derivee2 : public Base<Bidule>
    {
        /*...*/
    };
    (remarque qu'ici, ce n'est pas forcément du CRTP à proprement parler ) Derivee et Derivee2 ne partagent pas *forcement* le meme membre mbre (elles ne le partageront que si le type fourni comme spécialisation de Base est identique )
    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

Discussions similaires

  1. Héritage d'une classe template
    Par Bob.Killer dans le forum Langage
    Réponses: 3
    Dernier message: 14/11/2007, 13h08
  2. Héritage d'une classe en css
    Par picomz dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 27/12/2005, 16h10
  3. Réponses: 4
    Dernier message: 08/11/2005, 15h10
  4. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  5. Héritage d'une classe thread
    Par SamCB500 dans le forum MFC
    Réponses: 4
    Dernier message: 07/07/2005, 15h35

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