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 :

[debutant] probleme avec methode virtuelle pure


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut [debutant] probleme avec methode virtuelle pure
    Bon nouveau probleme , j ai un personnes .cc qui ressemble a ca :
    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
     
    class personne { 
        private: 
            string nom ; 
            string prenom ;
            string etablissement ; 
        public:
            personne () : nom(""), prenom(""), etablissement("UTBM"){};
            personne (string nvnom, string nvprenom="", string nvetablis="UTBM") :
                  nom(nvnom), prenom(nvprenom), etablissement(nvetablis){};
            virtual ~personne(){};
     
            virtual string get_nom() const;
            virtual string get_prenom() const;
            virtual string get_etablis() const;
            virtual string get_qualite() = 0;
     
            virtual personne& change_nom(string nvnom);
            virtual personne& change_prenom(string nvprenom);
            virtual personne& change_etablis(string nvetablis);
     
            virtual void affiche() const;
     
    }; 
     
    class etudiant : public personne { 
        private : 
            // donnees specifiques a etudiant 
            string branche; 
            string filiere; 
            int emploitemps;
     
        public : 
     
            etudiant() : branche(""),filiere(""),emploitemps(0){};
            etudiant(string nvnom, string nvprenom,string nvbranche="", string nvfiliere = "",                  int nvemploitemps = 0) : personne(nvnom, nvprenom),                  branche(nvbranche),filiere(nvfiliere),emploitemps(nvemploitemps){};
            ~etudiant(){};
     
            string get_branche() const;
            string get_filiere() const;
            int get_emploitemps() const;
     
            etudiant& change_branche ( string nvbranche);
            etudiant& change_filiere ( string nvfiliere);
            etudiant& change_emploitemps(int nvemploitemps);
            void affiche() const;
     
    };
    Mais au moment de la compilation , le compilo me dit qu il ne peut pas alouer un objet abstrait de type etudaint parce que cette fonction est pure ds la classe etudiant : personne :: get_qualite .

    J ai pourtt redefini cette fonction ds etudiant comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string etudiant :: get_qualite(){
    return filiere ; }
    Alors comprends pas ,encore ....

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    la méthode surcharger doit apparaître dans la signature de ta classe etudiant, il faudrait que ton code ressemble à ceci :
    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
    class personne { 
        private: 
            string nom ; 
            string prenom ;
            string etablissement ; 
        public:
            personne () : nom(""), prenom(""), etablissement("UTBM"){};
            personne (string nvnom, string nvprenom="", string nvetablis="UTBM") :
                  nom(nvnom), prenom(nvprenom), etablissement(nvetablis){};
            virtual ~personne(){};
    
            virtual string get_nom() const;
            virtual string get_prenom() const;
            virtual string get_etablis() const;
            virtual string get_qualite() = 0;
    
            virtual personne& change_nom(string nvnom);
            virtual personne& change_prenom(string nvprenom);
            virtual personne& change_etablis(string nvetablis);
             
            virtual void affiche() const;
             
    }; 
      
    class etudiant : public personne { 
        private : 
            // donnees specifiques a etudiant 
            string branche; 
            string filiere; 
            int emploitemps;
     
        public : 
                 
            etudiant() : branche(""),filiere(""),emploitemps(0){};
            etudiant(string nvnom, string nvprenom,string nvbranche="", string nvfiliere = "",                  int nvemploitemps = 0) : personne(nvnom, nvprenom),                  branche(nvbranche),filiere(nvfiliere),emploitemps(nvemploitemps){};
            ~etudiant(){};
    
            string get_branche() const;
            string get_filiere() const;
            string get_qualite();
            int get_emploitemps() const;
    
            etudiant& change_branche ( string nvbranche);
            etudiant& change_filiere ( string nvfiliere);
            etudiant& change_emploitemps(int nvemploitemps);
            void affiche() const;
             
    };
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    oui j l avais fait , j ai poste le mauvais code ... mais ca ne marche pas

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Et le code vrai code qui ne marche pas ?

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    peux-tu poster un code "minimal" qui permette de reproduire le problème ?

  6. #6
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    J'ai réécrit le code et ça fonctionne, je ne sais pas si c'est ce que tu attends exactement mais bon (la présentation diffère très légèrement, désolé, j'ai appris comme ça ^^)...

    class Personne
    {
    public:
    Personne (string vNom = "", string vPrenom = "", string vEtablissement = "UTBM") :
    nom (vNom), prenom (vPrenom), etablissement (vEtablissement) {};
    ~Personne () {};

    virtual string get_nom () const {return nom;}
    virtual string get_prenom () const {return prenom;}
    virtual string get_etablis () const {return etablissement;}
    virtual string get_qualite () = 0;

    virtual void change_nom (string vNom) {nom = vNom;}
    virtual void change_prenom (string vPrenom) {prenom = vPrenom;}
    virtual void change_etablis (string vEtabli) {etablissement = vEtabli;}

    private:
    string nom;
    string prenom;
    string etablissement;
    };

    class Etudiant : public Personne
    {
    public:
    Etudiant (string vNom = "", string vPrenom = "", string vBranche = "", string vFiliere = "") :
    Personne (vNom, vPrenom), branche (vBranche), filiere (vFiliere), emploiTemps (0) {};
    ~Etudiant () {};

    virtual string get_branche () const {return branche;}
    virtual string get_filiere () const {return filiere;}
    virtual string get_qualite () {};
    virtual int get_emploiTemps () const {return emploiTemps;}

    virtual void change_branche (string vBranche) {branche = vBranche;}
    virtual void change_filiere (string vFiliere) {filiere = vFiliere;}
    virtual void change_emploiTemps (int vEmploi) {emploiTemps = vEmploi;}

    void afficher () const {};

    private:
    string branche;
    string filiere;
    int emploiTemps;
    };
    EDIT : avec ton code ça marche aussi, j'ai juste rajouter des {} sur les fonctions qui n'en avait pas, comme ça elles sont définies...

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Lorsqu'une fonction est virtuelle, elle doit obligatoirement être définie dans le code, même si elle ne sera pas appelée, contrairement aux autres fonctions non virtuelles.
    De même, il est important de renvoyer toujours le bon type, par exemple ta fonction get_qualite ne retourne pas un string pour un etudiant, tu as droit à un warning pour ça, et les warnings, c'est toujours à supprimer

  8. #8
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    peux-tu poster un code "minimal" qui permette de reproduire le problème ?
    Oui je peux :

    personnes.h :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <string.h>
    #include "liste.h"
     
    using namespace std;
     
    class personne { 
        private: 
            string nom ; 
            string prenom ;
            string etablissement ; 
        public:
            personne () : nom(""), prenom(""), etablissement("UTBM"){};
            personne (string nvnom, string nvprenom="", string nvetablis="UTBM") :
                  nom(nvnom), prenom(nvprenom), etablissement(nvetablis){};
            virtual ~personne(){};
     
            virtual string get_nom() const;
            virtual string get_prenom() const;
            virtual string get_etablis() const;
            virtual string get_qualite() = 0;
     
            virtual personne& change_nom(string nvnom);
            virtual personne& change_prenom(string nvprenom);
            virtual personne& change_etablis(string nvetablis);
     
            virtual void affiche() const;
     
    }; 
     
    class etudiant : public personne { 
        private : 
            // donnees specifiques a etudiant 
            string branche; 
            string filiere; 
            int emploitemps;
     
        public : 
     
            etudiant() : branche(""),filiere(""),emploitemps(0){};
            etudiant(string nvnom, string nvprenom,string nvbranche="", string nvfiliere = "",                  int nvemploitemps = 0) : personne(nvnom, nvprenom),                  branche(nvbranche),filiere(nvfiliere),emploitemps(nvemploitemps){};
            ~etudiant(){};
     
            string get_branche() const;
            string get_filiere() const;
            string get_qualite() const{return "";};
            int get_emploitemps() const;
     
            etudiant& change_branche ( string nvbranche);
            etudiant& change_filiere ( string nvfiliere);
            etudiant& change_emploitemps(int nvemploitemps);
            void affiche() const;
     
    };
    personnes.cc :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <string.h>
    #include "personnes.h"
    #include "liste.h"
     
    using namespace std;
     
    string personne :: get_nom() const{
     
    return nom;
    }
     
    string personne :: get_prenom() const{
     
    return prenom;
    }
     
    string personne :: get_etablis() const{
     
    return etablissement;
    }
     
    personne& personne :: change_nom(string nvnom){
     
    nom = nvnom;
    return *this;
    }
     
    personne& personne :: change_prenom(string nvprenom){
     
    prenom = nvprenom;
    return *this;
    }
     
    personne& personne :: change_etablis(string nvetablis){
     
    etablissement = nvetablis;
    return *this;
    }
     
    void personne :: affiche() const {
    cout << "nom :"<<nom << "prenom :" << prenom;
    }
     
    string etudiant :: get_branche() const{
    return branche;
    }
     
    string etudiant :: get_filiere() const{
    return filiere;
    }
     
    int etudiant :: get_emploitemps() const{
    return emploitemps;
    }
     
    etudiant& etudiant :: change_branche ( string nvbranche){
    branche = nvbranche;
    return *this;
    }
     
    etudiant& etudiant :: change_filiere ( string nvfiliere){
    filiere = nvfiliere;
    return *this;
    }
     
    etudiant& etudiant :: change_emploitemps(int nvemploitemps){
    emploitemps = nvemploitemps;
    return *this;
    }
     
    void etudiant :: affiche() const{
    personne :: affiche();
    cout << "branche :" << branche << "filiere :" ;
    cout << filiere << "charge hebdomadaire : " << emploitemps;
    }
    main.cc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <string.h>
    #include "personnes.h"
    #include "liste.h"
     
    main()
    {
        bddpersonnes b;
        personne *p = new etudiant;
        b.ajout(p);
    }
    J'ai réécrit le code et ça fonctionne
    Oui cest depuis que j ai ecris le main/cc que ca ne va plus

  9. #9
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    normal que le compilo râle

    classe personne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual string get_qualite() = 0;
    classe etudiant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string get_qualite() const{return "";};
    les 2 fonctions n'ont rien à voir puisqu'elles n'ont pas la même signature. donc effectivement la classe etudiant comporte une fonction virtuelle pure et ne peut être instanciée.

    correction classe personne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual string get_qualite() const = 0;
    plein d'autres corrections :
    - enlever using namespace std; du .h (voir FAQ pour explication)
    - enlever les en-têtes qui ne sont pas nécessaires
    - et qui en plus ne sont pas toujours les bons, cf. iostream.h, string.h... (voir FAQ en-têtes C et C++)

  10. #10
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    Arf c pas la premiere fois que ca m arrive en plus ...

    Merci maintenant j ai plusieurs de references indefinies... est ce que qq un pourrait compiler ce programme pour voir si c est mon se qui deconne ?

    Sinon merci pour m avoir signaler les autres erreurs c tjrs bon a prendre

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    Volia j ai attache les fichiers si jamais ... j ai du change les extensions de personnes.cc et lsite .cc en cpp si jamais c est important

    merci d avance

Discussions similaires

  1. Réponses: 19
    Dernier message: 10/02/2005, 22h43
  2. [debutant]probleme avec wxwidgets
    Par iwky dans le forum wxWidgets
    Réponses: 11
    Dernier message: 23/01/2005, 20h23
  3. [DEBUTANT] Probleme avec glortho
    Par barthelv dans le forum OpenGL
    Réponses: 12
    Dernier message: 23/11/2004, 14h21
  4. [DEBUTANT] probleme avec split ?
    Par matN59 dans le forum ASP
    Réponses: 6
    Dernier message: 23/10/2004, 15h47
  5. Réponses: 2
    Dernier message: 31/08/2004, 11h45

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