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 :

Definition d'une classe dérivée d'un template


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 114
    Par défaut Definition d'une classe dérivée d'un template
    Bonjour,
    Ma question est toute simple et donc sera la réponse j'espère.
    Je voudrais savoir la syntaxe de définition d'une classe dérivée d'une classe parente ayant un template.
    Par exemple, voici comment la classe de base est définie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      template<class T>
    class MaClasse: public ClasseDeBase, public T
    {
     
    }
    La question est de savoir comment définir une classe dérivée.

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    voici deux exemple, je crois que c'est comme ca la syntaxe de mémoire

    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
    16
    17
    18
    19
    20
    21
    template<int a>
    class mere{
    ...
    }
     
    class fille : public mere<16>
    {
    ...}
     
     
     
    template <class T>
    class mere{
    ...
    }
     
     
    class fille: public mere<int>
    {
    ...
    }

  3. #3
    Membre averti
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Par défaut
    Euh j'ai pas tout comprit, j'espère que ma reponse t'aidera.
    Voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Mere {
    };
     
    template <class T>
    class Fille : public T {
    };
     
    int main() {
        Fille<Mere> obj;
     
        return EXIT_SUCCESS;
    }

  4. #4
    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
    A moins qu'il ne s'agisse comme le dit loicounet de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <class T>
    class Mere
    {
    // ...
    }
     
    template <class T>
    class Fille : public Mere<T>
    {
    // ...
    }

  5. #5
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Je pense que sa question est plutot "Peut-on faire hériter une classes d'un template ?"

    Personnelement, je n'ai pas essayé et je ne peux pas la ou je suis...

    Ceci dit, ca doit poser pas mal de problème...

    Sinon, la solution proposé par Alp et Loicounet doit bien te faire le résultat que tu veux (en déviant un peu) non ?

    Apo`

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    Je pense que sa question est plutot "Peut-on faire hériter une classes d'un template ?"
    Oui, je l'ai déjà fait donc c'est possible.

  7. #7
    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
    Ca ne pose aucun problème.

    Soit Mere<T> une classe template.

    On peut en hériter de 2 façons :
    - soit on fixe le type T : class Fille : public Mere<int>
    - soit la classe fille sera elle-même template : template <typename T> class Fille : public Mere<T>

    Et ça ne pose aucun problème. Il ne faut pas voir du mal dans les templates, bien au contraire

  8. #8
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Hmmm, visiblement j'ai autant mal formulé que franc82

    Il veut pas faire (enfin je pense....) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template <typename T>
    class Fille : public Mere<T>
    Il veut faire (enfin je pense toujours...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template <class Mere>
    class Fille : public Mere
    Ch'ui curieux de savoir si c'est possible

    Ceci dit, la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class Fille : public Mere<T>
    Fonctionne a merveille et revient au meme je pense (enfin, de l'utilité que j'en voie...)

    Apo`

  9. #9
    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
    Ah. J'avais mal compris.
    Faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <class Mere>
    class Fille : public Mere
    est tout à fait possible.

  10. #10
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Ok,

    Merci pour ma curiosité

    Ceci dit, ca doit poser pas mal de problème quand meme... Notemment niveau des attributs hérités tout betement... Enfin, dans le cadre d'héritage d'une classe complexe, l'utilisation qu'on en fait doit pas mal restreindre le template...

    Enfin bon, c'est pas le problème de franc82, c'est un autre débat

    Apo`

  11. #11
    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
    Je ne vois pas le soucis.

    C'est simple, si tu fais Fille<A>, ça va hériter de A publiquement, et voilà.

    Après, ce qui est intéressant, c'est de contraindre la classe de bases sur certains choses.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <class T>
    class Fille : public T
    {
      public:
      Fille(const A& a) 
      {
        T::init(a);
      }
    };
    Ici par exemple on oblige à ce que T possède une méthode init qui colle avec l'appel dans le constructeur de Fille<T>.

    Si on passe une classe T qui n'a pas de méthode init par exemple, cela génèrera une erreur à la compilation tout simplement.

  12. #12
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Oui, justement c'est exactement ce a quoi je pensais.

    L'utilisation de la class template dans la classe dériver va forcer la définition de certaines méthodes ou meme attributs dans la class T. Ce qui peut etre une bonne chose !!! Mais je pense que c'est à utiliser modérément, sinon autant faire une classe de base qui est déja contrainte et en hérite.

    Comme dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    template <typename T>
    class Mere
    {
      // bla bla
      void init();
    }
     
    template <typename T2>
    class Fille : public Mere<T2>
    {
         // bla bla
         void foo() {Mere::init();}
    }
    Mais la c'est ma vue conceptuelle des choses ^^ Niveau encapsulation et définition je trouve ca plus propre... Apres ca marche très bien aussi de l'autre manière !!!

    Apo`

  13. #13
    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
    Hmm je ne vois toujours pas le problème.

    Si tu contrains, c'est que tu as des raisons.

    C'est à dire qu'on peut passer n'importe quel type pour peu qu'il définisse telles ou telles fonctions, etc.

    Ca laisse de la souplesse. Pourtant, si on se rate, ce n'est pas grave car le compilo va nous dire que l'on passe un type qui ne satisfait pas les contraintes.

    On utilise parfois ce genre de choses pour faire une classe Singleton, par exemple.

    M'enfin avec les concepts de C++0x ça sera plus simple à gérer sans avoir un héritage au milieu.

  14. #14
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Ah oui, oui, je suis entierement d'accord.

    C'est juste un problème conceptuel la, aucunement technique.
    Le fait de "trop" restreindre une class par héritage, je le vois mieux restreind au niveau supérieur (une class en plus qui définie une base)

    Mais ca revient au meme ^^ (surtout si c'est pour réstreindre une seule méthode, auquel cas, faire une classe de base pour ca ne vaut pas la peine !)

    Apo`

  15. #15
    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
    Je trouve ça beaucoup trop lourd d'insérer une classe entre les deux... Qu'apporterait selon toi une classe qui vérifierait un cran avant que le type satisfait les contraintes ?

  16. #16
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Au niveau technique : absolument rien !!!

    Au niveau conceptuel : Si la classe doit avoir beaucoup de restrictions, la clarté de lisibilité et de compréhension de l'arbre de classes.

    Apo`

Discussions similaires

  1. Definition d'une classe python dans plusieurs fichiers
    Par wfargo dans le forum Général Python
    Réponses: 3
    Dernier message: 05/12/2006, 23h03
  2. problème d'accès dans une classe dérivée!
    Par chrono23 dans le forum C++
    Réponses: 47
    Dernier message: 10/10/2006, 11h22
  3. Réponses: 2
    Dernier message: 06/12/2005, 09h41
  4. Réponses: 4
    Dernier message: 20/11/2005, 05h48
  5. Déterminer le type d'une class dérivée
    Par LDDL dans le forum MFC
    Réponses: 3
    Dernier message: 10/12/2004, 17h36

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