L’héritage en
programmation C++
Exercice 1 :
Créer une classe
personnel comprenant 3 données membres (nom, position, salaire),
un constructeur
initialisant les données membres et une fonction affiche_personnel
qui affiche les
informations sur le personnel.
Créer une classe
patron dérivant publiquement de la classe personnel et ayant 2
données membres
(bonus_annuel, marque de voiture de fonction) , un constructeur
initialisant les
données membres et une fonction affiche_patron qui affiche les
informations sur
le patron (entant que membre du personnel et patron).
Créer un
programme permettant de tester ces classes.
Solution:
#include <iostream.h>
#include <string.h>
class personnel{
char *nom;
char *position;
int salaire;
public:
personnel(char
*nm, char *pos, int sal);
void
affiche_personnel();
};
class
patron:public personnel{/*class sousClasse: droit superClasse{};*/
int
bonus_annuel;
char*
marque_voiture;
public :
//constructeur
//sousClasse(liste
des paramètres (avec ceux de la super classe); //déclaration
//sousClasse::sousClasse(liste
de paramètres) : superClasse(paramètres pour
superClasse){}
//définition
patron(int b_a,
char* m_v,char *nm, char *pos, int sal);
void
affiche_patron();
};
personnel::personnel(char
*nm, char *pos, int sal){
cout<<"constructeur"<<endl;
salaire=sal;
nom=nm;
position=pos;
}
void
personnel::affiche_personnel(){
cout<<"Nom
: "<<nom<<endl;
cout<<"Position
: "<<position<<endl;
cout<<"Salaire
: "<<salaire<<endl;
}
patron::patron(int
b_a, char* m_v,char *nm, char *pos, int sal):personnel(nm, pos,sal)
{
bonus_annuel=b_a;
marque_voiture=m_v;
}
void
patron::affiche_patron(){
affiche_personnel();
//pas oublier
cout<<"bonus
annuel = "<<bonus_annuel<<endl;
cout<<"Marque
de voiture = "<<marque_voiture<<endl;
}
void main(){
personnel
b("gerald","gérant",1250);
patron
a(500,"BMW","fallon","PDG",2000);
b.affiche_personnel();
a.affiche_patron();
}
Exercice 2 :
a) Modifier les
classes définies dans l’exercice 1 en utilisant la fonction affiche dans
la classe de
base et la classe dérivée.
Modifier le
programme pour tester les modifications.
b) Créer dans le
programme principal un pointeur sur la classe personnel et un objet
de la classe
patron. Le pointeur sur la classe de base contient l’adresse de la classe
dérivée. Appeler
la fonction affiche en utilisant le pointeur sur la classe de base (il
faut qu’elle
affiche les informations sur la classe dérivée).
Solution:
#include <iostream.h>
#include <string.h>
class personnel{
char *nom;
char *position;
int salaire;
public:
personnel(char
*nm, char *pos, int sal);
void affiche();
};
class
patron:public personnel{/*class sousClasse: droit superClasse{};*/
int
bonus_annuel;
char*
marque_voiture;
public :
//constructeur
//sousClasse(liste
des paramètres (avec ceux de la super classe); //déclaration
//sousClasse::sousClasse(liste
de paramètres) : superClasse(paramètres pour
superClasse){}
//définition
patron(int b_a,
char* m_v,char *nm, char *pos, int sal);
void affiche();
};
personnel::personnel(char
*nm, char *pos, int sal){
cout<<"constructeur"<<endl;
salaire=sal;
nom=nm;
position=pos;
}
void
personnel::affiche(){
cout<<"Nom
: "<<nom<<endl;
cout<<"Position
: "<<position<<endl;
cout<<"Salaire
: "<<salaire<<endl;
}
patron::patron(int
b_a, char* m_v,char *nm, char *pos, int sal):personnel(nm, pos,sal)
{
bonus_annuel=b_a;
marque_voiture=m_v;
}
void
patron::affiche(){
//cout<<"Nom
: "<<nom<<endl;
//cout<<"Position
: "<<position<<endl;
//cout<<"Salaire
: "<<salaire<<endl;
personnel::affiche();
// si on ne veut
pas utiliser la résolution de portée
//on mets nos
données en mode protected
cout<<"bonus
annuel = "<<bonus_annuel<<endl;
cout<<"Marque
de voiture = "<<marque_voiture<<endl;
}
void main(){
/*
personnel
b("gerald","gérant",1250);
patron a(500,"BMW","fallon","PDG",2000);
b.affiche();
a.affiche();
*/
personnel
*pe=new personnel("Fallon","PDG",2000);
peà affiche();
patron *pa=new
patron(500,"PORSCHE","Toujirat","HautPDG",2250);
paàaffiche();
}
Exercice 3 :
Créer une classe
animal, puis des classes dérivées à poils et à plumes où vous dérivez
les
particularités respectives de chaque animal. Dans la classe de base,
implémentez
sous forme de
méthodes virtuelles les fonctions qui concernent l’animal en général
mais
s’appliquent différemment selon le type d’animal.
Solution:
#include <iostream.h>
#include <string.h>
class animal{
protected:
char nom[20];
public:
animal(char n[20]="");
virtual void manger();
};
class poils:public animal{
int pattes;
public:
poils(int pt=0,char n[20]="");
void manger();
};
class plumes:public animal{
int pattes;
public:
plumes(int pt=0,
char n[20]="");
void manger();
};
animal::animal(char
n[20]){
strcpy(nom,n);
}
void
animal::manger(){
cout<<"
l'animal suivant : "<<nom<<" a besoin de manger pour
survivre"<<endl;
}
poils::poils(int
pt,char n[20]):animal(n){
pattes=pt;
}
void
poils::manger(){
cout<<"l'animal
suivant : "<<nom<<" est carnivore"<<endl;
}
plumes
::plumes(int pt,char n[20]):animal(n){
pattes=pt;
}
void
plumes::manger(){
cout<<"l'animal
suivant :"<<nom<<" n'est pas carnivore et aime les
graines"<<endl;
}
void main(){
animal
p("tortue");
p.manger();
poils
q(4,"chat");
q.manger();
plumes
s(2,"pigeon");
s.manger();
animal *r;
r=&s;
r->manger();
}
Exercice 4 :
Créer une classe
nombre formée d’une unique variable entière et d’une méthode
affiche_nombre,
puis définir 3 classes dérivées afin d’afficher la variable aux formats
hexadécimal,
octal et décimal à l’aide d’une méthode affiche_nombre.
Solution:
#include <iostream.h>
class nombre{
protected:
int entier;
public:
nombre(int ent);
virtual void
affiche_nombre();
};
class
hexa:public nombre{
public:
hexa(int ent);
void
affiche_nombre();
};
class
octal:nombre{
public:
octal(int ent);
void
affiche_nombre();
};
class
decimal:nombre{
public:
decimal(int ent);
void
affiche_nombre();
};
nombre::nombre(int
ent){
entier=ent;
}
void
nombre::affiche_nombre(){
cout<<"voici
le nombre : "<<entier<<endl;
}
hexa::hexa(int
ent):nombre(ent){}
void
hexa::affiche_nombre(){
cout
<<" le nombre en hexa est de : "<<hex<<entier<<endl;
}
octal::octal(int
ent):nombre(ent){}
void
octal::affiche_nombre(){
cout
<<" le nombre en octal est de :
"<<oct<<entier<<endl;
}
decimal::decimal(int
ent):nombre(ent){}
void
decimal::affiche_nombre(){
cout
<<" le nombre en décimal est de : "<<dec<<entier<<endl;
}
void main(){
nombre a(12);
a.affiche_nombre();
decimal b(12);
b.affiche_nombre();
octal c(12);
c.affiche_nombre();
hexa d(12);
d.affiche_nombre();
}
Exercice 5 :
a) Créer une
classe Date ayant 3 paramètres jour, mois, année.
Elle contient un
constructeur initialisant les données membres.
Elle contient les fonctions getDay(), getMonth(),
getYear(), setDay(), setMonth(),
setYear() et
DateToString()
Le constructeur
attend en paramètre l'année, le mois puis le numéro de jour et les affecte dans
l'espace de données privé de l'objet.
Les méthodes
accesseurs permettent respectivement de récupérer le jour, le mois ou l'année
sous forme d'un entier (méthodes getxxx) et de changer ces mêmes propriétés
(méthodes setxxx). La méthode DateToString retourne une chaîne de caractères
représentant la date de l'objet sur lequel a été invoquée cette méthode au
format américain.
b) Nous voyons
que le constructeur et la méthode DateToString travaillent sur le format
américain. Comme cette classe est intégrée dans les librairies d'un
environnement de développement, il n'est pas possible de la modifier. Quelle
technique nous offre la programmation orientée objet pour pouvoir gérer nos
dates au format français tout en utilisant cette classe existante qui offre en
outre un ensemble d'autres services ? Ecrire le code correspondant pour gérer
un constructeur et une méthode retournant une chaîne au format français.
Solution:
#include <iostream.h>
#include <string>
#include <stdlib.h>
using namespace std;
class date{
protected:
int jour;
int mois;
int annee;
public:
date(int jr=0, int ms=0, int an=0);
void getday();
void getmonth();
void getyear();
void setday();
void setmonth();
void setyear();
virtual string datetostring();
};
class datefr:public date{
public:
datefr(int jr=0, int ms=0, int an=0);
string datetostring();
};
datefr::datefr(int jr, int ms, int
an):date(jr,ms,an){}
string datefr::datetostring(){
char tab1[60]="";
char
tab2[20]="";
char
tab3[20]="";
cout<<"date
en version europeenne"<<endl;
itoa(jour,tab1,10);
itoa(mois,tab2,10);
itoa(annee,tab3,10);
strcat(tab1,tab2);
//cout<<tab1<<endl;
strcat(tab1,tab3);
//cout<<tab1<<endl;
return tab1;
}
date::date(int
jr, int ms, int an){
jour=jr;
mois=ms;
annee=an;
}
void date::getday(){
cout<<"Jour
:"<<jour;
}
void
date::getmonth(){
cout<<"Mois
:"<<mois;
}
void
date::getyear(){
cout<<"Annee
:"<<annee<<endl;
}
void date::setday(){
cout<<"Entrer
le jour"<<endl;
cin>>jour;
}
void
date::setmonth(){
cout<<"Entrer
le mois"<<endl;
cin>>mois;
}
void date::setyear(){
cout<<"Entrer
l' annee"<<endl;
cin>>annee;
}
string
date::datetostring(){
char
tab1[60]="";
char
tab2[20]="";
char
tab3[20]="";
itoa(annee,tab1,10);
itoa(mois,tab2,10);
itoa(jour,tab3,10);
strcat(tab1,tab2);
//cout<<tab1<<endl;
strcat(tab1,tab3);
//cout<<tab1<<endl;
return tab1;
}
void main(){
date a;
a.setday();
a.setmonth();
a.setyear();
a.getday();
a.getmonth();
a.getyear();
string tab= a.datetostring();
for(int i=0;i<20;i++)
cout<<tab[i];
cout<<endl;
datefr b(22,9,81);
string tab1=b.datetostring();
for(int j=0;j<20;j++)
cout<<tab1[j];
cout<<endl;
}
Exercice 6 :
Créer une classe Etudiant ayant
les mêmes caractéristiques qu'une Personne plus une liste de matières suivies
et un ensemble de notes. On doit pouvoir obtenir la liste des matières,
affecter une note, calculer la moyenne.
Créer une classe Enseignant ayant
les mêmes caractéristiques qu'une Personne plus une liste de matières
enseignées, un nombre d'heures par matière et un tarif horaire. On doit pouvoir
obtenir les matières, faire un calcul du nombre d'heures total et déterminer le
coût de l'enseignant. Les fonctions membres de Etudiant et de Enseignant
doivent pouvoir manipuler
directement les données de la
classe Personne. Modifier en conséquence cette classe.
Créer un tableau d'Etudiant et un
tableau d'Enseignant. Les initialiser. Créer un
tableau de pointeurs de Personne
et affecter selon votre choix à ces personnes soit
un étudiant soit un enseignant.
Afficher l'ensemble des caractéristiques de ces
personnes "polymorphées". Les
détruire.
Solution:
#include <iostream.h>
#include <string.h>
void
menu_etudiant();
void
menu_enseignant();
class personne {
char nom[20];
char prenom[20];
int age;
public:
personne(char n[20]="",char
p[20]="",int a=0) {
strcpy(nom,n);
strcpy(prenom,p);
age=a;
}
void
identification() {
cout<<"Entrez
le nom de la personne : ";
cin>>nom;
cout<<"Entrez
le prenom de la personne : ";
cin>>prenom;
cout<<"Entrez
l'age de la personne : ";
cin>>age;
}
void affiche() {
cout<<"Nom
: "<<nom<<endl;
cout<<"Prenom :
"<<prenom<<endl;
cout<<"Age : "<<age<<endl;
}
};
class
etudiant:personne {
char cours[5];
int *notes;
public:
etudiant(char
n[20],char p[20],int a,char c[5],int *no):personne(n,p,a){
strcpy(cours,c);
notes=new int
[5];
}
void affect_etudiant()
{
personne::identification();
menu_etudiant();
for(int
i=0;i<5;i++) {
cout<<"Quelle
est la matiere ? ";
cin>>cours[i];
if(cours[i]=='x') break;
cout<<"Notes
obtenues ? ";
cin>>notes[i];
}
}
void affiche() {
float moy=0;
personne::affiche();
cout<<"Cours
suivis et notes : "<<endl;
for(int i=0;i<5;i++) {
if(cours[i]=='p')
cout<<"Programmation"<<"
"<<notes[i]<<endl;
if(cours[i]=='e')
cout<<"Electronique"<<"
"<<notes[i]<<endl;
if(cours[i]=='r')
cout<<"Reseau"<<"
"<<notes[i]<<endl;
if(cours[i]=='t')
cout<<"Technologie des composants
electroniques"<<"
"<<notes[i]<<endl;
if(cours[i]=='x') break;
moy=moy+notes[i];
}
cout<<"Moyenne
de l'etudiant : "<<moy/4<<endl;
}
};
class
enseignant:public personne {
char
matieres[5];
int *nbre_heure;
int
tarif_horraire;
public:
enseignant(char
n[20],char p[20],int a,char mat[5],int *heures,int
tarif):personne(n,p,a)
{
strcpy(matieres,mat);
nbre_heure=new
int [5];
tarif_horraire=tarif;
}
void
affect_enseignant() {
personne::identification();
menu_enseignant();
for(int
i=0;i<5;i++) {
cout<<"Une
matiere enseignee : ";
cin>>matieres[i];
if(matieres[i]=='x') break;
cout<<"Nombre
d'heures pour ce cours : ";
cin>>nbre_heure[i];
}
cout<<"Tarif
horraire de cet enseignant : ";
cin>>tarif_horraire;
}
void affiche() {
int
total_heure=0,total_salaire=0;
personne::affiche();
cout<<"Cours
donnes et nombre d'heures : "<<endl;
for(int i=0;i<5;i++) {
if(matieres[i]=='p')
cout<<"Programmation"<<"
"<<nbre_heure[i]<<endl;
if(matieres[i]=='e')
cout<<"Electronique"<<"
"<<nbre_heure[i]<<endl;
if(matieres[i]=='r')
cout<<"Reseau"<<"
"<<nbre_heure[i]<<endl;
if(matieres[i]=='t')
cout<<"Technologie des composants
electroniques"<<"
"<<nbre_heure[i]<<endl;
if(matieres[i]=='m')
cout<<"Laboratoire de micro
controlleur"<<"
"<<nbre_heure[i]<<endl;
if(matieres[i]=='o') cout<<"Micro
ordinateur"<<"
"<<nbre_heure[i]<<endl;
if(matieres[i]=='x') break;
total_heure=total_heure+nbre_heure[i];
}
total_salaire =
total_heure * tarif_horraire;
cout<<"Nombre
d'heures donnees par l'enseignant :
"<<total_heure<<endl;
cout<<"Salaire
de l'enseignant : "<<total_salaire<<endl;
}
};
void main() {
cout<<"Etudiant
: "<<endl;
etudiant
etu1("Touijrat","Abdel",29,"pe",0);
etu1.affect_etudiant();
etu1.etudiant::affiche();
cout<<"Enseignant
: "<<endl;
enseignant
ens1("Dedecker","Jeff",45,"e",0,13);
ens1.affect_enseignant();
ens1.enseignant::affiche();
}
void
menu_etudiant() {
cout<<"Entrez
'p' pour programmation"<<endl;
cout<<"Entrez
'e' pour electronique"<<endl;
cout<<"Entrez
't' pour tce"<<endl;
cout<<"Entrez
'r' pour reseau"<<endl;
cout<<"Pour
arreter, tappez x"<<endl;
}
void
menu_enseignant() {
cout<<"Entrez
'p' pour programmation"<<endl;
cout<<"Entrez
'e' pour electronique"<<endl;
cout<<"Entrez
't' pour tce"<<endl;
cout<<"Entrez
'r' pour reseau"<<endl;
cout<<"Entrez
'm' pour laboratoire de microcontrolleur"<<endl;
cout<<"Entrez
'o' pour micro ordinateur"<<endl;
cout<<"Pour
arreter, tappez x"<<endl;
}
ConversionConversion EmoticonEmoticon
Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.