Partage
  • Partager sur Facebook
  • Partager sur Twitter

polymorphisme et héritage

Sujet résolu
    18 juin 2007 à 23:05:25

    bonsoir à tous !!

    vous l'aurez compris: j'ai un problème !

    je fais un petit programme qui permet de gérer les salariés d'une entreprise ainsi que leurs fiches de paie. Les salariés sont répartis en plusieurs catégories (cadre, technicien, administratif, intérimaire, commercial).
    Ces 5 catégories sont autant de classes dérivées de la classe salarié (ou dérivant d'une classe de catégorie). Je voudrais que les méthodes implantées dans la classe salarié soient polymorphes. Pour le moment, la méthode qui m'embête est "void acquerir(void)". Elle doit permettre l'acquisition clavier d'un salarié. Cependant, quand je lui mets "virtual" devant le prototype, je me fais insulter par le compilateur et je ne comprends pas pourquoi.

    Voici mes différents fichiers:

    salarie.h:
    #include "etat_civil.h"
    #include "fiche_salaire.h"

    // création d'un type 'catégorie'
    typedef enum {Administratif = 1, Technique, Interimaire, Cadre, Commercial} categorie;

    class salarie
    {
            private:
                    fiche_salaire fiche;
                    etat_civil etat;
            public:
                    salarie(string n = "", string p = "", string d = "");
                    ~salarie(void);

                    void acquerir(void); // acquisition d'un salarie
                    virtual void afficher(void); // affiche moi-même à l'écran
                    void calcul(void); // calcule la fiche de salaire
                    void modifier_salaire(double s, double d); // modifie la fiche de salaire

    };

    #endif


    salarie.cpp:
    #include "salarie.h"

    salarie::salarie(string n, string p, string d) // constructeur classe salarie
    {
            etat.modifier(n, p, d);
    }
    salarie::~salarie(void) // destructeur classe salarie
    {
    }

    void salarie::acquerir(void) // acquisition d'un salarie
    {
            etat.acquerir();
    }

    void salarie::afficher(void) // affiche moi-même à l'écran
    {
            etat.afficher();
            fiche.afficher();
    }

    void salarie::calcul(void) // calcule la fiche de salaire
    {
    }

    void salarie::modifier_salaire(double s, double d) // modifie la fiche de salaire
    {
            fiche.modifier(s, d);
    }


    categorie.h:
    #include "salarie.h"



    class administratif : public salarie
    {
            private:
                   
            public:
                    administratif(string n = "", string p = "", string d = "");
                    ~administratif(void);

                    void calcul(void); // calcule la fiche de salaire

    };

    class technique: public administratif
    {
            private:
                    double heures_sup;

            public:
                    technique(string n = "", string p = "", string d = "", double h = 0);
                    ~technique(void);

                    void calcul(void); // calcule la fiche de salaire
                    void acquerir(void); // acquisition d'un technicien

    };

    class interimaire: public salarie
    {
            private:
                    double jour;

            public:
                    interimaire(double j = 0, string n = "", string p = "", string d = "");
                    ~interimaire(void);

                    void calcul(void); // calcule la fiche de salaire
                    void acquerir(void);

    };

    class cadre: public salarie
    {
            private:
                    double deplacement;
            public:
                    cadre(string n = "", string p = "", string d = "", double dd = 0);
                    ~cadre(void);

                    void calcul(void); // calcule la fiche de salaire
                    void acquerir(void);
                    double depla(void);
                    void modif_deplacement(double);

    };

    class commercial: public cadre
    {
            private:
                    double ca;

            public:
                    commercial(string n = "", string p = "", string d = "", double dd = 0, double c_a = 0);
                    ~commercial(void);

                    void calcul(void); // calcule la fiche de salaire
                    void acquerir(void); //

    };


    categorie.cpp:
    #include "categorie.h"

    /****************************************************************
                            classe administratif
    *****************************************************************/

    administratif::administratif(string n, string p, string d): salarie(n, p, d)
    {
            salarie::modifier_salaire(0, 0);
    }

    administratif::~administratif(void)
    {
    }

    void administratif::calcul(void) // calcule la fiche de salaire
    {
            salarie::modifier_salaire(1200, 0);
    }

    /****************************************************************
                            classe technique
    *****************************************************************/

    technique::technique(string n, string p, string d, double h): administratif(n, p, d)
    {
            heures_sup = h;
            salarie::modifier_salaire(0, 0);
    }

    technique::~technique(void)
    {
    }

    void technique::calcul(void) // calcule la fiche de salaire
    {
            salarie::modifier_salaire(1200 + heures_sup * 12, 0);
    }

    void technique::acquerir(void) // acquisition des heures sup
    {
            salarie::acquerir();
            cout<<"heures sup:";
            cin>>heures_sup;
            cout<<endl;
    }

    /****************************************************************
                            classe intérimaire
    *****************************************************************/

    interimaire::interimaire(double j, string n, string p, string d): salarie(n, p, d)
    {
            salarie::modifier_salaire(0, 0);
            jour = j;
    }
    interimaire::~interimaire(void)
    {
    }

    void interimaire::calcul(void) // calcule la fiche de salaire
    {
            modifier_salaire(jour * 80, 0);
    }

    void interimaire::acquerir(void)
    {
            salarie::acquerir();
            cout<<"jours : ";
            cin>>jour;
            cout<<endl;
    }

    /****************************************************************
                            classe cadre
    *****************************************************************/

    cadre::cadre(string n, string p, string d, double dd): salarie(n, p, d)
    {
            salarie::modifier_salaire(0, 0);
            deplacement = dd;
    }

    cadre::~cadre(void)
    {
    }

    void cadre::calcul(void) // calcule la fiche de salaire
    {
            modifier_salaire(2500, deplacement);
    }

    void cadre::acquerir(void)
    {
            salarie::acquerir();
            cout<<"frais de deplacements : ";
            cin>>deplacement;
            cout<<endl;
    }

    double cadre::depla(void)
    {
            return deplacement;
    }

    void cadre::modif_deplacement(double d)
    {
            deplacement = d;
    }

    /****************************************************************
                            classe commercial
    *****************************************************************/

    commercial::commercial(string n, string p, string d, double dd, double c_a): cadre(n, p, d, dd)
    {
            salarie::modifier_salaire(0, 0);
            ca = c_a;
    }
    commercial::~commercial(void)
    {
    }

    void commercial::calcul(void) // calcule la fiche de salaire
    {
            modifier_salaire(2500 + ca * 10 / 100, cadre::depla());
    }

    void commercial::acquerir(void)
    {
            cadre::acquerir();
            cout<<"chiffre d'affaire : ";
            cin>>ca;
            cout<<endl;
    }


    principal.cpp:
    #include "Divers.h"
    #include "etat_civil.h"
    #include "categorie.h"
    #include "personnel.h"

    void main(void)
    {
            salarie * s = new cadre();
            (*s).acquerir();
            (*s).afficher();
            delete s;
           
    }


    pourriez-vous m'éclairer ?
    merci par avance

    [edit]
    en fait ça marche...je ne sais pas ce que j'ai fait
    désolé pour le dérangement...
    • Partager sur Facebook
    • Partager sur Twitter

    polymorphisme et héritage

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown