UNIVERSITE DE LA MANOUBA
----- -----
ECOLE NATIONALE DES SCIENCES DE
L'INFORMATIQUE
Mati re : POO
Classe : I.I. 1A
A-U : 2016-2017
S rie N 4 Polymorphisme en C++
class B : public A
{
public:
B(){cout<<"B::B()"<<endl;}
~B(){cout<< "B:: ~B()"<<endl;}
void f1() {cout << " B::f1()" << endl;}
virtual void f2() {cout << " B::f2()" <<
endl;}
} ;
Exercice n 1
Soit le code C++ comportant les classes A et B suivantes :
class A
{
public:
A(){cout<<"A::A()"<<endl;}
virtual ~A() { cout<< "A:: ~A()"<<endl;}
virtual void f1() {cout << "A::F1()" <<
endl;}
void f2(){cout << " A::f2()" << endl;}
};
1. Quel est le r sultat daffichage du code suivant ?
void main(){ B obj; }
2. Quelle est la diff rence entre une m thode virtuelle et une m thode non virtuelle au niveau de la
convention d'appel ?
3. Quel est le r sultat daffichage du code suivant ?
void main()
{B *pB = new B;
A *pA = pB;
pA->f1();
pB->f2();
pB->f1();
pA->f2();}
Exercice n 2
Publicité
Soit le code c++ suivant :
class Figure{
public :
Figure(string nom) : nom_(nom) { }
string getNom() const { return nom_; }
virtual void intersection(const Figure& f) const = 0;
virtual void intersection(const Cercle& c) const = 0;
virtual void intersection(const Rectangle& r) const = 0;
private:
string nom_;};
class Cercle : public Figure{
public :
Cercle(string nom) : Figure(nom) { }
virtual void intersection(const Figure& f) const;
virtual void intersection(const Cercle& c) const;
virtual void intersection(const Rectangle& r) const;};
void Cercle::intersection(const Cercle& c) const
{cout << "Inter. cercle " << getNom() << " et cercle " <<c.getNom() <<endl;}
void Cercle::intersection(const Rectangle& r) const
{cout << "Inter. cercle " << getNom() << " et rectangle " <<r.getNom()<< endl;}
void Cercle::intersection(const Figure& f) const{f.intersection(*this);}
class Rectangle : public Figure{
public :
Rectangle(string nom) : Figure(nom) { }
virtual void intersection(const Figure& f) const;
virtual void intersection(const Cercle& c) const;
virtual void intersection(const Rectangle& r) const;
};
void Rectangle::intersection(const Cercle& c) const{cout << "Inter. rectangle " <<
getNom() << " et cercle " <<c.getNom()<< endl;}
void Rectangle::intersection(const Rectangle& r) const {cout << "Inter. rectangle " <<
getNom() << " et rectangle " <<r.getNom() << endl;}
void Rectangle::intersection(const Figure& f) const {f.intersection(*this);}
1. Donnez larborescence des classes d finies pr c demment.
2. On vous demande de donner laffichage obtenu lors de lex cution du programme suivant :
void main(){
1/3
Cercle c1("C1");
Cercle c2("C2");
Rectangle r1("R1");
Rectangle r2("R2");
Publicité
Figure* ptr1 = new Cercle("C3");
Figure* ptr2 = new Rectangle("R3");
cout << "Ligne 1" << endl;
c1.intersection(c2);
cout << "Ligne 2" << endl;
ptr1->intersection(r1);
cout << "Ligne 3" << endl;
c2.intersection(*ptr2);
cout << "Ligne 4" << endl;
ptr2->intersection(*ptr1);
delete ptr1;
delete ptr2;
}
Exercice 3
Soit le code C++ suivant :
Soit les deux classes Process et Thread
suivantes :
class Process{
int pid;
public:
Process( ) { pid = 0; cout<<"Process
Defaut"<<endl; }
Process(Process&
cout<<"Process Copie\n";
Process(int x) { pid = x; cout<<"Process
Param"<<endl; }
~Process()
{
Destructeur"<<endl; }
virtual void imprimer() {cout << "pid="<<
pid << endl;}
};
class Thread : public Process{
int tid;
Process p;
public:
Thread():Process() { tid=0; cout<<"Thread
Defaut\n"; }
Thread(
int
cout<<"Thread Param\n"; }
Publicité
~Thread()
Destructeur"<<endl;}
void imprimer() { cout << "tid=" << tid <<
endl; }
};
{cout<<"Thread
cout<<"Process
v):Process(v)
pid=B.pid
tid=1;
B)
;
{
{
void Fonction(Thread x) { x.imprimer();}
Process obj_pro1;
int main( )
{Thread obj_thr1(2);
Process *ptr_pro = new Process [2];
ptr_pro[0].imprimer();
delete [] ptr_pro;
obj_thr1.imprimer();
ptr_pro = &obj_thr1;
ptr_pro->imprimer();
obj_thr1.Process::imprimer();
Process obj_pro2(obj_pro1);
obj_pro2.imprimer();
Fonction(obj_thr1);
return 0;}
1. Pour chacune des instructions de la fonction main(), indiquez ce qui sera affich l cran.
2. Ajouter le constructeur de recopie de la classe Thread qui doit contenir linstruction
cout<<"Thread Copie \n et donner le nouveau affichage de linstruction suivante :
Fonction(obj_thr1) ;
Exercice 4
Une entreprise de Patagonie d veloppe un moteur huile de rutabaga, et dote plusieurs v hicules de ce moteur.
Avant d'effectuer des tests grandeur nature, l'entreprise con oit un programme de simulation du comportement
des v hicules. Ce programme sera crit en C++. On ne s'int resse dans cet exercice qu' une toute petite partie
de ce programme. Le probl me que l'on veut r soudre dans un premier temps est celui de la repr sentation des
v hicules et du calcul de la vitesse maximum pouvant tre atteinte par un v hicule. Tout v hicule poss de
une immatriculation (cha ne de caract res) et un poids vide (r el). Certains v hicules peuvent transporter
un chargement : on appelle alors charge le poids de ce chargement. La charge d'un v hicule ne doit pas
Publicité
d passer un certain poids, que l'on appellera charge maximale, d pendant du type de v hicule. Les diff rents
2/3
types de v hicules dot s du fameux moteur sont les suivants : les petits bus, les camions citernes, et les
camions b ch s.
" la classe petit_ bus a un poids vide de 4 tonnes, et peut atteindre une vitesse maximale de 150 km/h. Il ne
poss de pas de chargement (le poids des passagers est consid r comme n gligeable par rapport au poids
vide).
" la classe camion_citerne a un poids vide de 3 tonnes et une charge maximale de 10 tonnes. Sa vitesse
maximale d pend de sa charge :
- 130 km/h si la charge est nulle
- 110 km/h si la charge est inf rieure ou gale 1 tonne
- 90 km/h si la charge est sup rieure 1 tonne et inf rieure ou gale 4 tonnes
- 80 km/h pour une charge sup rieure 4 tonnes.
" la classe camion_b ch a un poids vide de 4 tonnes et une charge maximum de 20 tonnes. Sa vitesse
maximale d pend galement de sa charge (mais charge gale, un camion citerne a une vitesse maximale plus
faible, car le liquide qu'il transporte est plus instable qu'un chargement solide):
- 130 km/h si la charge est nulle
- 110 km/h si la charge est inf rieure ou gale 3 tonnes
- 90 km/h si la charge est sup rieure 3 tonnes et inf rieure ou gale 7 tonnes
- 80 km/h au del .
Les classes v hicule, petit_ bus, camion_citerne, camion_b ch poss dent une m thode affichage
affichage permettant dafficher les caract ristiques de chaque v hicule. Les ing nieurs de l'entreprise
fournissent une formule permettant de calculer la consommation de carburant d'un v hicule en fonction de sa
vitesse et de son poids total (poids vide + charge ventuelle) consommation = (vitesse-en-km/h)/10 +
(poids_total-en-tonnes). Cette formule est la m me pour tous les types de v hicules, la m thode au calcul de
consommation de carburant correspondante est : float consommation (int v, int p), qui retourne la consommation
(en litres pour 100 km) d'un v hicule de poids p allant une vitesse v.
Question 1
Donnez linterface et limpl mentation des classes V hicule, petit_bus, camion_citerne, camion_b ch .
Question 2
On s'int resse maintenant la d finition d'une classe Convoi, permettant de g rer un convoi de v hicules.
Cette classe contient une collection de v hicules h t rog nes. Lajout des v hicules se fait toujours la fin. La
classe Convoi doit savoir calculer la vitesse maximale d'un convoi, sachant que cette vitesse correspond la
plus petite des vitesses maximales des v hicules du convoi. Cette classe poss de aussi les m thodes permettant
lajout et la suppression de v hicules.
Donnez linterface et limpl mentation de la classe Convoi (pensez utiliser le conteneur Vector de STL).
Question 3
Donnez la partie du code permettant de :
a) cr er un convoi C,
b) cr er deux camions b ch s
c) cr er un petit bus
d) cr er trois camions citerne
e) ajouter ces v hicules C
f) afficher les descriptions et la vitesse maximale de chaque v hicule de C.
3/3