Polymorphisme en C++

École Nationale des Sciences de l'Informatique (ENSI)
Page 1 sur 3Lecteur de document UniversityLib

Polymorphisme en C++

École Nationale des Sciences de l'Informatique (ENSI) · Programming · exam

Voir tous les documents en programmation

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