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

C++ Discussion :

un problème d'Héritage


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut un problème d'Héritage
    bonjour, je débute en C++ et je ne comprend pas l'erreur (s'il y en a une) suivante:

    je crée une classe mère:
    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
     
    #include <iostream>
    #include <string> 
     
    using namespace std;
     
    class oiseau {
          protected:
                  string id;
                  double nbKm;
                  double vit;
          public:
     
                 oiseau(string i="aa",double nb=0,double v=1.5);
            void changeId(string s);      
            void affiche(); 
            void vole(int nbSec);
     
     
          };
     
    oiseau::oiseau(string i,double nb,double v):id(i),nbKm(nb),vit(v){}
    Puis la classe fille:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class migrateur : public oiseau{
          private:
                  oiseau oi;
                  string pays;
          public:
                 migrateur(double nb=1000,string p="france");
            void affiche();
          };
     
     migrateur::migrateur(double nb,string p):pays(p){
                                oi.nbKm=nb;}
    et le compilateur me dit:

    `double oiseau::nbKm' is protected

    c'est vrai, mais les données protégées sont censés être accessible par toutes les classes filles, non?
    Comment faire sinon?
    (je veut juste créer un constructeur qui prend 2 paramètres servant a initialiser les valeurs nbKm et pays, ayant respectivement les valeurs par défaut 1000 et "france").

    merci d'avance!!

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Seules les données de this sont disponibles aux classes filles quand elles sont protected: La classe fille ne peut pas accéder aux données protected d'une autre instance.

    De plus, pourquoi ta classe qui hérite de oiseau contient-elle un oiseau ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    C'est peut être une cigogne avec un petit.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut
    pour Médinoc:

    et bien parce que un Migrateur est un type particulier d'oiseau, qui va posséder en plus le pays de migration.
    N'est-il donc pas logique de luis faire hériter des caractéristiques de "Oiseau"?

    comment puis-je réctifier mon constructeur de migrateur?
    (qui prend 2 paramètres servant a initialiser les valeurs nbKm et pays, ayant respectivement les valeurs par défaut 1000 et "france")

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Ce que te dit Medinoc, et qui semble pas logique, c'est que tu stockes un autre oiseau (oi) dans ton objet migrateur.

    Citation Envoyé par Niazov Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class oiseau {};
     
    class migrateur : public oiseau
    {
      private:
        oiseau oi;
    };

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class migrateur : public oiseau{
    suffit à l'héritage des "caractéristiques" de oiseau: un migrateur est un oiseau.
    Si tu ajoutes un champ membre oiseau, tu as un oiseau qui en contient un autre: une cigogne qui porte un petit oiseau, un rapace qui a avalé un moineau, etc.

    Et je te conseille, en plus, de passer les string en tant que référence constante.

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par Biozic Voir le message
    un rapace qui a avalé un moineau, etc.
    bien vu !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut
    ok, je vois pourquoi il ne faut pas redéclarer oiseau dans la classe fille.
    Je vais faire un constructeur du genre:

    migrateur::migrateur(double nb,string p):oiseau("aa",nb,1.5),pays(p){}

    mais ça ne répond pas exactement au constructeur que je désirerai:
    je voudrai juste avoir a régler nbKm et le pays, le reste reprenant les a défaut de la classe mère.

    Maintenant comment puis-je récuppérer la fonction affiche() de la classe mère pour la réutiliser dans la classe fille ? (c'est a dire juste en rajoutant le champs pays)

  9. #9
    Membre éclairé Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Par défaut
    ecoutes Niazov
    si migrateur est une classe fille de oiseau alors elle contient par defaut tous les attributs de cette derniere.
    Donc si tu veux faire un constructeur pour migrateur servant a initialiser les valeurs nbKm et pays, ayant respectivement les valeurs par défaut 1000 et "france" je ne vois pas pourquoi t'as besoin des deux parametres.
    je crois que tu peux faire comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     migrateur::migrateur( ):oiseau(),nbKm(1000),pays("france")
    avec oiseau() le construteur par defaut de la calsse oiseau.

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par guitariste Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     migrateur::migrateur( ):oiseau(),nbKm(1000),pays("france")
    Non tu ne peux pas : nbKm n'est pas un membre direct de la classe migrateur donc il n'est pas initialisable ici.

    Tu peux initialiser pays, mais tu devras appeler le constructeur d'oiseau pour lui passer le nombre de kilomètres.
    Comme dans oiseau le nombre de kilomètres n'est pas le premier argument, il faudra également que lui passe l'id...

    Deuxième solution : comme le nombre de kilometres est protected, tu peux affecter la valeur plus loin dans le constructeur mais tu perds le bénéfice de la liste d'initialisation.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut
    Dans ce cas a je peux ruser en prenant dans le constructeur de Oiseau, nbKm en premier paramètre?

    d'autre part j'ai une question sur les méthodes virtuelles (pour la fonction affiche()) , est-ce correcte :

    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
    class oiseau {
          protected:
                  string id;
                  double nbKm;
                  double vit;
          public:
     
                 oiseau(string i="aa",double nb=0,double v=1.5);
            void changeId(string s);      
    virtual void affiche(); 
            void vole(int nbSec);
     
     
          };
     
    void oiseau::affiche(){
         cout<<id<<endl;
         cout<<nbKm<<endl;
         //cout<<vit<<endl;
         }
    puis:

    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
     
    class migrateur : public oiseau{
          private:
                  string pays;
          public:
                 migrateur(double nb=1000,string p="france");
            void affiche();
          };
     
    void migrateur::affiche(){
         cout<<id<<endl;
         cout<<nbKm<<endl;
         cout<<vit<<endl;
         cout<<pays<<endl;
        }
    c'est comme ça qu'il faut utiliser les méthodes virtuelles? (car il n'y a pas de problème a la compilation, mais lors de l'éxecution ça bug)

    merci encore de m'avoir aidé pour les questions précédentes!!

  12. #12
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Oui c'est comme ça que s'utilisent les méthodes virtuelles. Généralement on met aussi dans la classe fille migrateur que affiche est virtuelle. Ca ne fait rien du tout de plus, si ce n'est que quand tu relis le code de ta classe fille, tu as l'indication.

    Tu dis que ça bug à l'éxécution ? quels sont les symptomes ?

    Dans ce cas a je peux ruser en prenant dans le constructeur de Oiseau, nbKm en premier paramètre?
    C'est à dire déclarer plutôt ton constructeur comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oiseau( double nb=0, string i="aa", double v=1.5 );

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut
    oui , j'ai changé le constructeur et maintenant ça marche bien(y compris la méthode virtuelle).
    Merci beaucoup et merci à tous!!

    (enfin, je reviendrai sans doute vous casser les pieds avec mes questions à la noix, vu que mon projet n'est malheureusement pas fini...)

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

Discussions similaires

  1. [C#] Problème d'héritage, aide svp :(
    Par choas dans le forum Windows Forms
    Réponses: 12
    Dernier message: 06/05/2006, 11h46
  2. problème constructeur + héritage
    Par BOLARD dans le forum C++
    Réponses: 10
    Dernier message: 13/04/2006, 08h11
  3. [AS2] Problème d'héritage
    Par wwave dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 27/01/2006, 09h26
  4. Problème d'héritage ?
    Par Romanops dans le forum WinDev
    Réponses: 2
    Dernier message: 16/11/2005, 17h18
  5. Problème d'héritage d'une méthode protégée
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 28/04/2005, 23h17

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