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 :

Revision sur Virtual fonction et heritage


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Points : 68
    Points
    68
    Par défaut Revision sur Virtual fonction et heritage
    Bonjour,
    Alors cela fait un petit bout de temps que je n'ai pas programmé et la je me fais des petites révisions et j'avoue que sur ce code je ne comprends pas pourquoi ca ne fonctionne pas.

    Je m'explique, a la fin je cree un pointeur de type Personne et je le genere avec le constructeur Etudiant (enfin je voudrais). Je m'attend donc a pouvoir utiliser la fonction AffecteNote. Mais non, ca ne tourne pas ! Par contre lors de la fermeture du programme, ca plante...et la ca m'étonne moins, puisqu'il doit faire appelle au destructeur étudiant et donc essayer d'accéder aux notes (mNote) du pointeur p, qui n'existe pas !
    Je ne comprends pas....

    Merci d'avance !


    La partie qui pose problème est a la fin.
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
     
    /*DEBUT*/
    /*CODE TEST 2005*/
     
    #include <iostream.h>
    #include <string.h>
    #define N 5   
     
    /*Declaration de la classe Personne*/
    class Personne{
          char *mNom,*mPrenom;
          signed int *mAge;
     
          public:
          Personne();
          Personne(char*,char*,int);
          ~Personne();
          void ModAge(int);
          void ModNom(char*);
          void ModPrenom(char*);
          char* LireNom() const;
          char* LirePrenom() const;
          int LireAge() const;
          /*virtual*/ void Affiche() const;
          void Affecte(Personne Pers);
          void operator=(const Personne&);
          };
     
     
    /*Constructeur Personne par defaut*/
    Personne::Personne()
    {
          mNom=new char[15];
          mPrenom=new char[15];
          mAge=new signed int(0);
          if(mNom!=NULL&&mPrenom!=NULL&&mAge!=NULL)
          {cout<<"Construction Effectue !"<<endl;
          cout<<"Nom: ";
          cin.get(mNom,14);
          fflush(stdin);
          cout<<"Prenom: ";
          cin.get(mPrenom,14);
          fflush(stdin);
          cout<<"Age: ";
          cin>>*mAge;
          fflush(stdin);
          }
          else cout<<"Echec!";
     
    }
     
     
    /*Constructeur Personne avec parametres*/
    Personne::Personne(char *Nom,char *Prenom,int Age)
    {
          mNom=new char[strlen(Nom)];
          strcpy(mNom,Nom);
          mPrenom=new char[strlen(Prenom)];
          strcpy(mPrenom,Prenom);
     
          mAge=new signed int(Age);
     
                cout<<"Construction Effectue !"<<endl;
    }
     
    /*Destructeur personne*/
    Personne::~Personne()
    {
                         delete(mAge);
                         delete(mNom);
                         delete(mPrenom); 
                         cout<<"Destruction Effectuee!"<<endl;                   
    }
     
     
    /*Fonction pour modifier l'age*/
    void Personne::ModAge(int a)
    {
                         *mAge=a;
    }
     
    /*Fonction pour modifier le nom*/
    void Personne::ModNom(char* Nom)
    {
                           mNom=Nom;
    }
     
    /*Fonction pour modifier le prenom*/
    void Personne::ModPrenom(char* Prenom)
    {
                              mPrenom=Prenom;
    }
     
    /*Fonction pour lire l'age*/
    int Personne::LireAge() const
    {return *mAge;}
     
    /*Fonction pour lire le nom*/
    char* Personne::LireNom() const
    {
                        return mNom;
    }
     
    /*Fonction pour lire le prenom*/
    char* Personne::LirePrenom() const
    {
                         return mPrenom;                       
    }
     
     
    /*Affiche les statuts d'une personne*/
    void Personne::Affiche() const
    {
     cout<<"Nom : "<<mNom<<endl; 
     cout<<"Prenom : "<<mPrenom<<endl;
     cout<<"Age : "<<*mAge<<endl; 
     cout<<endl;                         
    }
     
    /*Copie les statuts d'une personne*/
    void Personne::Affecte(Personne Pers)
    {
         strcpy(mNom,Pers.LireNom());
         strcpy(mPrenom,Pers.LirePrenom());
         *mAge=Pers.LireAge();
    }
     
    /*Copie les statuts d'une personne par opperateur = */
    void Personne::operator=(const Personne &Pers)
    {
     
         strcpy(mNom,Pers.LireNom());
         strcpy(mPrenom,Pers.LirePrenom());
         *mAge=Pers.LireAge();        
     
    }
     
    /*Declaration de la classe Eudiant derive de Personne*/
    class Etudiant:public Personne{
          float *mNote;
          float mMoy;
          public:
                 Etudiant();
                 ~Etudiant();
                 float AfficheNote();
                 /*virtual*/ void AffecteNote();
                 float CalculMoy();
                 void AffecteNote(int,float);
                 /*virtual*/ void Affiche();
                 };
     
    /*Constructeur Etudiant*/             
    Etudiant::Etudiant()
    {
                        cout<<"construction"<<endl;
                        mNote=new float[N];
                        mMoy=0;
    }
     
    /*Destructeur Etudiant*/
    Etudiant::~Etudiant()
    {delete(mNote);}
     
     
    /*Affiche les notes pour une classe Etudiant*/
    float Etudiant::AfficheNote()
    {
          size_t i=0;
          while(i<N)
          cout<<"["<<mNote[i++]<<"]";
          cout<<endl;
    }
     
    /*Affectation des notes pour une classe Etudiant*/
    void Etudiant::AffecteNote()
    {
         size_t i=0;
          while(i<N)
          {
          cout<<"Note "<<i+1<<" : ";
          cin>>mNote[i++];
          fflush(stdin);
          }
    }
     
    /*Affectation directes des notes pour une classe Etudiant*/
    void Etudiant::AffecteNote(int ind,float n)
    {
         if(ind>=10&&ind<N)
         mNote[ind]=n;
         else
         cout<<"Mauvais Indice!";
    }
     
    /*Calcule la moyenne de l'etudiant*/
    float Etudiant::CalculMoy()
    {
         float moy=0;
          size_t i=0;
         while(i<N)
          moy+=mNote[i++];
     
         return moy/N;
     
     
    }
     
    /*Affiche les statuts d'un etudiant*/
    void Etudiant::Affiche()
    {
     cout<<"Nom : "<<LireNom()<<endl; 
     cout<<"Prenom : "<<LirePrenom()<<endl;
     cout<<"Age : "<<LireAge()<<endl; 
     AfficheNote();
     cout << "hello etudiant"<< endl;
     cout<<endl;       
    }
     
     
     
     
     
    /*Fonction principale */    
    int main (void)
    {
        /*Creation de personnne pour le fun*/
        Personne prems("Eric","Demaison",23);
        Personne deuz("Bob","Eponge",55);
        Personne troiz("Jean","Aramis",32);
        Personne quatz("Louise","DuVallon",15);
     
        size_t i=0;
        Personne tab[]={prems,deuz,troiz,quatz}; 
        while(i<4)
        tab[i++].Affiche();
        i=0;
     
        /*Test de quelques fonction*/
        prems.Affecte(deuz);
        prems=troiz;
        prems.Affiche();
     
       /*Creation d'un etudiant*/
       Etudiant moi;
       moi.AffecteNote();
       moi.AfficheNote();
       moi.Affiche();
       cout<<moi.LireNom()<<" a une moyene de "<<moi.CalculMoy()<<endl;
     
       /*PERSONNE ET ETUDIANT */
       Personne *p;
       p=new Etudiant();
       p->Affiche();
     p->AffecteNote();
     
        system("pause");
     
        return 0;    
    }
     
     
    /*FIN*/

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Hum ...
    1- Mauvaise gestion des chaînes.
    - taille incorrecte pour les allocations : tu oublies le compter le 0 terminal
    - confusion delete[]/delete
    - dans l'absolu pas exception-safe

    => Tes connaissances du C++ ont pris la poussière, depuis 98 il dispose officiellement d'une classe pour gérer les chaine de caractères -> std::string
    Apprends à t'en servir avant de partir dans des trucs comme l'héritage.

    2- Le fait que l'âge soit un pointeur n'a pas le moindre sens.

    3- La fonction Affecte, de même que ton opérateur d'affectation ne seront jamais compatibles avec ton héritage. Oublie les. Quel intérêt de copier des personnes de toutes façons. Au mieux, à supposer que les dupliquer s'avère nécessaire, tu les cloneras (-> FAQ).

    4- flush ne te sert à rien.

    5- Pour les tableaux de notes, les vecteurs seront tes amis.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Points : 68
    Points
    68
    Par défaut ....moui
    Merci,
    Effectivement, je n'ai jamais utilisé string
    Donc, je vais regarder ca, mais juste pour comprendre la, l'erreur dont je parle, elle vient d'ou....
    Quand au pointeur pas d'inquiétude c'était pour le fun, de même que copier des personnes c'est pour le fun aussi...Mon but c'est pas de faire un agenda
    Merci encore

    -------------------------------------
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
     
    /*DEBUT*/
    /*CODE TEST 2005*/
     
    #include <iostream.h>
    #include <string.h>
    using namespace std;
     
    #define N 5   
     
    /*Declaration de la classe Personne*/
    class Personne{
          string mNom,mPrenom;
          signed int mAge;
     
          public:
          Personne();
          Personne(string,string,int);
          ~Personne();
          void ModAge(int);
          void ModNom(string);
          void ModPrenom(string);
          string LireNom() const;
          string LirePrenom() const;
          int LireAge() const;
          /*virtual*/ void Affiche() const;
          void Affecte(Personne Pers);
          void operator=(const Personne&);
          };
     
     
    /*Constructeur Personne par defaut*/
    Personne::Personne()
    {
          //mNom=new char[15];
          //mPrenom=new char[15];
     
     
     
          cout<<"Nom: ";
          cin>>mNom;
     
          cout<<"Prenom: ";
          cin>>mPrenom;
     
          cout<<"Age: ";
          cin>>mAge;
          cout<<"Construction Effectue !"<<endl;
     
     
     
    }
     
     
    /*Constructeur Personne avec parametres*/
    Personne::Personne(string Nom,string Prenom,int Age)
    {
     
          mNom=Nom;
     
          mPrenom=Prenom;
     
          mAge=Age;
     
                cout<<"Construction Effectue !"<<endl;
    }
     
    /*Destructeur personne*/
    Personne::~Personne()
    {
                         cout<<"Destruction Effectuee!"<<endl;                   
    }
     
     
    /*Fonction pour modifier l'age*/
    void Personne::ModAge(int a)
    {
                         mAge=a;
    }
     
    /*Fonction pour modifier le nom*/
    void Personne::ModNom(string Nom)
    {
                           mNom=Nom;
    }
     
    /*Fonction pour modifier le prenom*/
    void Personne::ModPrenom(string Prenom)
    {
                              mPrenom=Prenom;
    }
     
    /*Fonction pour lire l'age*/
    int Personne::LireAge() const
    {return mAge;}
     
    /*Fonction pour lire le nom*/
    string Personne::LireNom() const
    {
                        return mNom;
    }
     
    /*Fonction pour lire le prenom*/
    string Personne::LirePrenom() const
    {
                         return mPrenom;                       
    }
     
     
    /*Affiche les statuts d'une personne*/
    void Personne::Affiche() const
    {
     cout<<"Nom : "<<mNom<<endl; 
     cout<<"Prenom : "<<mPrenom<<endl;
     cout<<"Age : "<<mAge<<endl; 
     cout<<endl;                         
    }
     
    /*Copie les statuts d'une personne*/
    void Personne::Affecte(Personne Pers)
    {
         mNom=Pers.LireNom();
         mPrenom=Pers.LirePrenom();
         mAge=Pers.LireAge();
    }
     
    /*Copie les statuts d'une personne par opperateur = */
    void Personne::operator=(const Personne &Pers)
    {
     
         mNom=Pers.LireNom();
         mPrenom=Pers.LirePrenom();
         mAge=Pers.LireAge();        
     
    }
     
    /*Declaration de la classe Eudiant derive de Personne*/
    class Etudiant:public Personne{
          float *mNote;
          float mMoy;
          public:
                 Etudiant();
                 ~Etudiant();
                 float AfficheNote();
                 /*virtual*/ void AffecteNote();
                 float CalculMoy();
                 void AffecteNote(int,float);
                 /*virtual*/ void Affiche();
                 };
     
    /*Constructeur Etudiant*/             
    Etudiant::Etudiant()
    {
                        cout<<"construction"<<endl;
                        mNote=new float[N];
                        mMoy=0;
    }
     
    /*Destructeur Etudiant*/
    Etudiant::~Etudiant()
    {delete(mNote);}
     
     
    /*Affiche les notes pour une classe Etudiant*/
    float Etudiant::AfficheNote()
    {
          size_t i=0;
          while(i<N)
          cout<<"["<<mNote[i++]<<"]";
          cout<<endl;
    }
     
    /*Affectation des notes pour une classe Etudiant*/
    void Etudiant::AffecteNote()
    {
         size_t i=0;
          while(i<N)
          {
          cout<<"Note "<<i+1<<" : ";
          cin>>mNote[i++];
          }
    }
     
    /*Affectation directes des notes pour une classe Etudiant*/
    void Etudiant::AffecteNote(int ind,float n)
    {
         if(ind>=10&&ind<N)
         mNote[ind]=n;
         else
         cout<<"Mauvais Indice!";
    }
     
    /*Calcule la moyenne de l'etudiant*/
    float Etudiant::CalculMoy()
    {
         float moy=0;
          size_t i=0;
         while(i<N)
          moy+=mNote[i++];
     
         return moy/N;
     
     
    }
     
    /*Affiche les statuts d'un etudiant*/
    void Etudiant::Affiche()
    {
     cout<<"Nom : "<<LireNom()<<endl; 
     cout<<"Prenom : "<<LirePrenom()<<endl;
     cout<<"Age : "<<LireAge()<<endl; 
     AfficheNote();
     cout << "hello etudiant"<< endl;
     cout<<endl;       
    }
     
     
     
     
     
    /*Fonction principale */    
    int main (void)
    {
        /*Creation de personnne pour le fun*/
        Personne prems("Eric","Demaison",23);
        Personne deuz("Bob","Eponge",55);
        Personne troiz("Jean","Aramis",32);
        Personne quatz("Louise","DuVallon",15);
     
        size_t i=0;
        Personne tab[]={prems,deuz,troiz,quatz}; 
        while(i<4)
        tab[i++].Affiche();
        i=0;
     
        /*Test de quelques fonction*/
        prems.Affecte(deuz);
        prems=troiz;
        prems.Affiche();
     
       /*Creation d'un etudiant*/
       Etudiant moi;
       moi.AffecteNote();
       moi.AfficheNote();
       moi.Affiche();
       cout<<moi.LireNom()<<" a une moyene de "<<moi.CalculMoy()<<endl;
     
       /*PERSONNE ET ETUDIANT */
       Personne *p;
       p=new Etudiant();
       p->Affiche();
       p->AffecteNote();
     
        system("pause");
     
        return 0;    
    }
     
     
    /*FIN*/
    Simplement, j'aimerais quand même comprendre cette histoire d'heritage la...

    Merci encore...je ne sais vraiment pas pourquoi mon prof de l'epoque nous forcait a ne pas utiliser string...

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu ne peux pas appeler une fonction sur un type qui ne la connait pas.


    Accessoirement, j'avais manqué
    - s/<iostream.h>/<iostream>
    - s/<string.h>/<string>
    - s/#define N 5/const int N=5;/


    Si je t'ai parlé des affectations, c'est parce que les copies sont incompatibles avec les hiérarchies polymorphes. Peu importe que tu cherches à t'amuser, cela ne marchera jamais correctement.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Points : 68
    Points
    68
    Par défaut Tres bien !
    Merci ! Tout est note !

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

Discussions similaires

  1. doc sur les fonctions
    Par masterfab dans le forum C
    Réponses: 18
    Dernier message: 23/06/2005, 17h55
  2. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  3. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00
  4. Déclenchement Programme sur Virtual Key
    Par Tom-G dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 09/05/2003, 12h58
  5. PerlDoc sur une fonction d'un module
    Par lesouriciergris dans le forum Modules
    Réponses: 2
    Dernier message: 13/03/2003, 20h50

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