Choisissez votre style : colorisé, impression

Série 21 :
Polymorphisme

Buts

Cette série a pour but de vous faire découvrir les bases du polymorphisme.

Préliminaires :

Avant de commencer les exercices décrits dans cette série, créez le répertoire ~/Desktop/myfiles/Programmation/cpp/serie21 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é.


Exercice 0 : reprise de l'exemple du cours (Polymorphisme, niveau 0)

Pages 147 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 aux polymorphisme par l'exemple des collections hétérogènes de véhicules. 

Cliquez ici si vous souhaitez faire cet exercice.


Exercice 1 : Formes polymorphiques (niveau 1)

Exercice n°60 (pages 150 et 335) de l'ouvrage C++ par la pratique.
Le but de cet exercice est de vous illustrer les problèmes qui peuvent se poser lorsque l'on veut manipuler des objets de façon polymorphique (un objet pouvant se substituer à un autre objet). 

Il s'agit de manipuler quelques formes géométriques simples en leur associant une petite méthode qui affiche leur description. 

1.1 Formes :

Dans un fichier formes.cc, définissez une classe Forme en la dotant de la méthode void description() qui affiche « Ceci est une forme ! » à l'écran. 

Ajoutez au programme une classe Cercle héritant de la classe Forme, et possédant la méthode void description() qui affiche « Ceci est un cercle. » à l'écran. 

Recopiez ensuite  la fonction main suivante, et testez votre programme : 

int main()
{                 
    Forme f;                    
    Cercle c;                    
    f.description();             
    c.description();         
    return 0;
}

Ajoutez maintenant ceci à la fin de la fonction main:

 Forme f2(c);
 f2.description();

Testez ensuite à nouveau votre programme.

Voyez-vous vu la nuance ?
Pourquoi a-t-on ce fonctionnement ?

Continuons nos prospections...

Ajoutez encore au programme une fonction :

void affichageDesc(Forme& f)

qui affiche la description de la forme passée en argument en utilisant sa méthode description.

Finalement, modifiez le main ainsi :

int main()
{                 
    Forme f;                    
    Cercle c;                    
    affichageDesc(f);
    affichageDesc(c);
    return 0;
}

Testez le programme... Le résultat vous semble-t-il satisfaisant ? Pourquoi?

Modifiez le programme (ajoutez 1 seul mot) pour que le résultat soit plus conforme à ce que l'on pourrait attendre.

1.2 Formes abstraites

Recopiez le programme précédent dans le fichier formesabstraites.cc, et modifiez la classe Forme de manière à en faire une classe abstraite en lui ajoutant la méthode virtuelle pure double aire().

Écrivez également une classe Triangle et modifiez la classe Cercle existante héritant toutes deux de la classe Forme, et implémentant les méthodes aire() et description().

Vous l'aurez deviné, la classe Triangle aura comme attributs base et hauteur ainsi qu'un constructeur adéquat, et Cercle aura comme seul attribut rayon (ainsi qu'un constructeur adéquat).

Modifiez la fonction affichageDesc pour qu'elle affiche, en plus, l'aire de la forme passée en paramètre et testez avec la fonction main suivante :

int main()
{                 
    Cercle c(5);                    
    Triangle t(10, 2);
    affichageDesc(t);
    affichageDesc(c);
    return 0;
}    

Exercice 2 : encore des vaccins (niveau 1, polymorphisme)

Nous allons partir d'un code existant et y mettre un peu de polymorphisme.

Partez du fichier fourni le vaccins.cc.

Vous allez maintenant y définir une classe Compagnie modélisant la compagnie pharmaceutique qui fabrique les vaccins. Cette classe sera caractérisée par :

La classe Compagnie devra être dotée (au minimum) des méthodes suivantes :

Attention : le calcul des coûts de production doit pouvoir se faire de façon polymorphique.

Complétez votre main avec :

L'exécution devrait alors produire un affichage voisin de celui-ci :

test de la partie 4.1 
Zamiflu
volume/dose : 0.55
nombre de doses: 200000
mode de fabrication haute technologie

Triphas
volume/dose : 0.2
nombre de doses: 10000
mode de fabrication standard

le  cout deproduction de  v1 et v2 est : 306500
test des parties suivantes ...
le  cout de production de  v3 et v4 est : 16143.8

Coûts de production de l'ensemble du stock:
Zamiflu
volume/dose : 0.55
nombre de doses: 200000
mode de fabrication haute technologie

Triphas
volume/dose : 0.2
nombre de doses: 10000
mode de fabrication standard

Zamiflu
volume/dose : 0.55
nombre de doses: 15000
mode de fabrication haute technologie

Triphas
volume/dose : 0.2
nombre de doses: 15000
mode de fabrication standard

le  cout de production a été de : 322644

Projet : continuation

Cette semaine, vous continuez à coder l'étape 2 de l'énoncé du projet.