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 : Passage d'une classe mere à une classe fille


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut Héritage : Passage d'une classe mere à une classe fille
    Bonjour à tous,

    Je suis entrain de créer un petit logiciel sur Qt Creator, et je bloque un peu sur une histoire de classe fille héritant d'une classe mere...

    Ma logique me paraissait censée au départ, mais maintenant, je me demande si je peux réellement faire ce que je souhaite...

    Je m'explique :

    J'ai une classe mère fruit qui ne contient pas grand chose, et deux classes filles (pomme et banane) héritant de la classe fruit.

    Dans le code de mon application, j'ai un tableau de fruit, dans lequel je souhaite pouvoir stocket soit des pommes soit des bananes... Ca fonctionne bien car comme les 2 sont hérités de la classe fruit, pas de problème!

    Par contre, plus loin dans mon code j'utilise ce tableau de fruit, je le parcours et je souhaite pouvoir traiter chaque élement comme une pomme ou une banane, mais mon compilateur ne voit mes objets que comme des fruits (donc pas d'accès aux attributs et fonctions particuliers à la pomme et a la banane...), alors qu'au départ il s'agissait bien de pomme et de banane...

    Enfin voila mon problème Est-ce que ma logique est bonne, ou est-ce qu'il est impossible de faire ce que je fais ? (il faut passer par un cast ou quelque chose dans le style ?)

    Merci d'avance pour vos réponses et les éventuelles pistes que vous pourrez me donner.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Ne peux-tu pas te contenter du polymorphisme ?
    En déclarant virtual les fonctions de l'interface fruit, lors du parcours de ton tableau ce sont les fonctions du vrai type qui seront appelées.

    Sinon oui il te faut réaliser un cast (dynamic ou static si je ne me trompe), mais tu perds tout l'intérêt de l'héritage et surtout : comment tu sais si tu as une banane ou une pomme quand tu parse un fruit du tableau ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut
    Merci pour ta réponse,

    En fait dans ma classe fruit, j'avais ajouté un attribut de type (afin de savoir si le fruit était une banane ou une pomme), c'est avec cet attribut que je comptais savoir quel type de fruit j'avais a traiter...

    Mais je pense que tu as probablement raison, je vais essayer de partir sur du polymorphisme... Par contre a ce sujet, encore une petite question...

    Si lors du parcours de mon tableau j'arrive à
    mon_fruit.attribut_pomme

    Est ce que je peux accéder à mon attribut de cette manière (si on part du principe que mon_fruit est une pomme et que attribut_pomme est déclaré en public) ou est-ce qu'il faut forcément que je passe par une fonction virtuelle dans la classe fruit (du genre virtual fruit::getAttributPomme(), et qui du coup n'aura plus de sens dans le cas d'une banane) ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Tu te focalises trop sur la pomme ou la banane.
    Il faut rester en vu d'un fruit, quelconque.

    http://apais.developpez.com/tutoriel...ge_5#LXXII-B-4
    http://apais.developpez.com/tutoriel...age=page_1#LIV

    hésite pas à fournir un peu de code.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Dans ton panier de fruit, stocke des pointeurs vers tes fruits, et utilise le polymorphisme.

    Si tu veux vraiment stocker des objets, il faut passer par Boost.Any.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    La question: qu'est-ce que les fruits ont en commun qui pourrait être utilisé sans savoir si on a une pomme ou une banane, mais avec un résultat différent pour la pomme ou la banane?
    Ex: getCouleur():Couleur retournerait une Couleur rouge ou verte pour une pomme, une Couleur systématiquement jaune pour une banane.
    Si ta réponse à la question est: rien, pomme et banane sont des fruits mais je les utilise complètement différemment, alors ton héritage n'a pas de sens...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut
    Voila un peu de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class fruit
    {
    public:
        fruit();
        // Attributs
        QString type_fruit; // 1=>pomme, 2=>banane
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class pomme : public fruit
    {
    public:
        pomme();
        // Attributs
        int att_pomme_1;
        int att_pomme_2;
        int att_pomme_3;
        int att_pomme_4;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class banane : public fruit
    {
    public:
        banane();
        // Attributs
        int att_banane_1;
        int att_banane_2;
        int att_banane_3;
        int att_banane_4;
    };
    Ensuite, voila le code que je peux retrouver dans mon main

    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
    22
    23
    24
    25
     
    QVector<fruit> panier_fruit;
    [---]
    pomme unePomme = new pomme();
    banane uneBanane = new banane();
    // Remplissage des attributs particuliers aux deux fruits
    [---]
    panier_fruit.append(unePomme);
    panier_fruit.append(uneBanane);
     
    [---]
     
    int nb = panier_fruit.count();
    for(int i=0; i<nb; i++) {
     
    fruit temp_fruit = panier_fruit.at(i);
    if (temp_fruit.type_fruit=="pomme") {
       my_var_pomme = temp_fruit.att_pomme_1;
       my_var_pomme_2 = temp_fruit.att_pomme_2;
    } else {
       my_var_banane = temp_fruit.att_banane_1;
       my_var_banane_2 = temp_fruit.att_banane_2;
    }
     
    }
    Voila ça ressemble a peu près à ça (ce n'est pas le code exact, car je nel'ai pas sous la main pour l'instant, mais c'est exactement ça dans l'idée).

    Et donc c'est la partie d'affectation qui évidemment ne marche pas (par ex : my_var_pomme = temp_fruit.att_pomme_1 ou mon compilateur me dit naturellement que att_pomme_1 n'est pas un attribut de fruit...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/07/2014, 18h41
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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