Choisissez votre style : colorisé, impression

Série 23 :
Héritage multiple

Buts

Cette série a pour but de vous faire pratiquer la notion d'héritage multiple.

Préliminaires :

Avant de commencer les exercices décrits dans cette série, créez le répertoire ~/Desktop/myfiles/Programmation/cpp/serie23 et travaillez dans ce répertoire pour les exercices ne faisant pas partie du projet. 
.

Si vous n'avez pas le temps de faire la partie "exercices" de la série, veillez au moins à en consulter le corrigé.


Reprise de l'exemple du cours (Héritage multiple, niveau 0)

Pages 156 et suivantes de l'ouvrage C++ par la pratique.

Le but de cet exercice est de reprendre l'exemple du cours illustrant les notions relatives à l'héritage multiple au moyen du petit exemple zoologique des ovovivipares.

Cliquez ici si vous souhaitez faire cet exercice.


Exercice 1 : Animaux en peluche (Héritage multiple, niveau 1)

Exercice n°63 (pages 160 et 351) de l'ouvrage C++ par la pratique.

Une société protectrice des animaux souhaite commercialiser des animaux en peluche à l'effigie de ses protégés pour renflouer ses caisses.

Elle possède déjà un programme C++ où les animaux sont représentés par une classe, Animal, dotées des attributs et méthodes suivantes:

Les animaux en danger y sont représentés par une autre classe, EnDanger, dotée:

Une troisième classe, Gadget, existe dans ce programme. Elle représente l'ensemble des "gadgets" commercialisés par notre société et contient les attributs et méthodes suivants :

Dans un fichier peluches.cc, reproduisez le codage de ces classes.

Dotez ces classes de constructeurs prenant l'ensemble des attributs nécessaires comme paramètres et affichant les messages:

Dotez également ces classes de destructeurs affichant les messages:

Animaux en peluches

Notre société souhaite doter ses peluches d'étiquettes décrivant les caractéristiques de l'animal représenté.

Définissez une classe Peluche héritant des classes Animal, EnDanger et Gadget (eh oui.. C++ permet quelques bizarreries génétiques !).

Dotez votre classe Peluche d'une méthode etiquette affichant le texte à mettre sur l'étiquette de la peluche.

Ce texte aura la forme suivante:

 
Hello, 
Mon nom est Ming.
Je suis un Panda  et je vis en Asie.
Il ne reste que 200 de mes congénères sur terre.
Achetez moi pour 20 francs et vous contribuerez
à me sauver!

la méthode etiquette devra être codée au moyen des méthodes affiche et affiche_prix des super-classes.

Dotez également votre classe d'un constructeur et d'un destructeurs affichant des messages analogues à ceux des super-classes.

Testez votre programme au moyen du main suivant et observez l'ordre d'invocation des constructeurs/destructeurs :

int main()
{ 
  Peluche panda("Panda","Ming","Asie", 200, 20.0);
  Peluche serpent("Cobra","Ssss","Asie", 500, 10.0);
  Peluche toucan("Toucan","Bello","Amérique", 1000, 15.0);

 
  panda.etiquette();
  serpent.etiquette();
  toucan.etiquette();

  return 0;
}

Exercice 2 : Employés (Héritage multiple) (niveau 1)

Exercice n°64 (pages 162 et 354) de l'ouvrage C++ par la pratique.

Cet exercice vous permettra de concevoir une hiérarchie de classes comportant de l'héritage multiple. Il vous servira également de révision pour la notion de collections hétérogène vue dans la série 8.

Le directeur d'une entreprise de produits chimiques souhaite gérer les salaires et primes de ses employés au moyen d'un programme C++.

Un employé est caractérisé par son nom, son prénom, son âge et sa date d'entrée en service dans l'entreprise.

Dans un fichier salaires.cc, codez une classe abstraite Employe dotée des attributs nécessaires, d'une méthode virtuelle pure calculer_salaire (ce calcul dépendra en effet du type de l'employé) et d'une méthode virtuelle get_nom retournant la chaîne de caractères "L'employé " suivit du prénom et du nom.

Dotez également votre classe d'un constructeur prenant en paramètre l'ensemble des attributs nécessaires et d'un destructeur virtuel vide.

Calcul du salaire

Le calcul du salaire mensuel dépend du type de l'employé. On distingue les types d'employés suivants :

Codez dans votre fichier salaires.cc une hiérarchie de classes pour les employés en respectant les conditions suivantes :

Employés à risques

Certains employés des secteurs production et manutention sont appelés à fabriquer et manipuler des produits dangereux.

Après plusieurs négociation syndicales, ces derniers parviennent à obtenir une prime de risque mensuelle.

Complétez votre programme salaires.cc en introduisant deux nouvelles sous-classes d'employés. Ces sous-classes désigneront les employés des secteurs production et manutention travaillant avec des produits dangereux.

Ajouter également à votre programme une nouvelle super-classe pour les employés à risque permettant de leur associer un attribut prime mensuelle. Cette classe sera dotée d'un constructeur initialisant la prime mensuelle à 100 francs par défaut. Elle fournira également un destructeur virtuel vide.

Collection d'employés

Satisfait de la hiérarchie proposée, notre directeur souhaite maintenant l'exploiter pour afficher le salaire de tous ses employés ainsi que le salaire moyen.

Ajoutez une classe Personnel contenant une « collection  » d'employés. Il s'agira d'une collection « hétérogène » d'Employe - regardez la série 8 si vous ne voyez pas de quoi il s'agit.
Vous pouvez aussi choisir de faire hériter cette classe de la classe « tableau dynamique de pointeurs sur des Employe », et alors utiliser la méthode push_back.

Prototypez et définissez ensuite les méthodes suivantes à la classe Personnel :

Dotez également votre classe Personnel d'une méthode licencie permettant de supprimer tous les employés stockés dans la collection, tout en libérant leur espace mémoire.

Testez votre programme avec le main suivant :

int main () {
  Personnel p;
  p.ajouter_employe(new Vendeur("Pierre", "Business", 45, "1995", 30000));
  p.ajouter_employe(new Representant("Léon", "Vendtout", 25, "2001", 20000));
  p.ajouter_employe(new Technicien("Yves", "Bosseur", 28, "1998", 1000));
  p.ajouter_employe(new Manutentionnaire("Jeanne", "Stocketout", 32, "1998", 45));
  p.ajouter_employe(new TechnARisque("Jean", "Flippe", 28, "2000", 1000, 200));
  p.ajouter_employe(new ManutARisque("Al", "Abordage", 30, "2001", 45, 120));

  p.afficher_salaires();
  cout << "Le salaire moyen dans l'entreprise est de "  
       << p.salaire_moyen() << " francs." << endl;

  // libération mémoire
  p.licencie();
}

Vous devriez obtenir quelque chose comme :

Le vendeur Pierre Business gagne 6400 francs.
Le représentant Léon Vendtout gagne 4800 francs.
Le technicien Yves Bosseur gagne 5000 francs.
Le manut. Jeanne Stocketout gagne 2925 francs.
Le technicien Jean Flippe gagne 5200 francs.
Le manut. Al Abordage gagne 3045 francs.
Le salaire moyen dans l'entreprise est de 4561.67 francs.

Projet : continuation

Cette semaine, vous commencez à coder l'étape 3 de l'énoncé.