Vous êtes sur la page 1sur 3

UNIVERSITE DE LA MANOUBA Matière : POO

-----¤¤¤¤----- Classes : I.I. 1


ECOLE NATIONALE DES SCIENCES DE A-U : 2012-2013
L'INFORMATIQUE
Correction de la série N°5 – Polymorphisme en C++
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;}
};
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;}
};
1. Quel est le résultat d’affichage du code suivant ?
void main(){ B obj; }
Solution:
A::A()
B::B()
B:: ~B()
A:: ~A()
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 d’affichage du code suivant ?
void main()
{
B *pB = new B;
A *pA = pB;
pA->f1();
pB->f2();
pB->f1();
pA->f2();
}

Solution :
A::A()
B::B()
B::f1()
B::f2()
B::f1()
A::f2()
Exercice n°2
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:

1/3
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 l’arborescence des classes définies précédemment.
2. On vous demande de donner l’affichage obtenu lors de l’exécution du programme suivant :
void main(){
Cercle c1("C1");
Cercle c2("C2");
Rectangle r1("R1");
Rectangle r2("R2");
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;
}
Solution :
Ligne 1
Inter. cercle C1 et cercle C2
Ligne 2
Inter. cercle C3 et rectangle R1
Ligne 3
Inter. rectangle R3 et cercle C2
Ligne 4
Inter. cercle C3 et rectangle R3
Exercice 3
Le but de cet exercice est de regrouper dans une classe de base, appelée BaseListe, les opérations
communes aux listes LIFO et FIFO, puis de spécialiser cette classe par dérivation en une classe permettant
de gérer une pile (liste LIFO) et une classe permettant de gérer une queue (liste FIFO).
Ecrire une classe BaseListe, une classe ListeLifo, et une classe ListeFifo pouvant être utilisées avec le
programme suivant :
void main()
{
BaseListe *ptPile;

2/3
ListeFifo fifo;
ListeLifo lifo;
ptPile=&fifo;
*ptPile<0<1; //on empile 0 puis 1
cout<<"pile="<<*ptPile; //à l'écran : pile = 0 1
int i;
*ptPile>i; //on dépile dans i
cout<<"pile="<<*ptPile<<"i="<<i; //à l'écran pile=1 i=0
ptPile=&lifo;
*ptPile<0<1; //on empile 0 puis 1
cout<<"pile="<<*ptPile; //à l'écran : pile = 0 1
*ptPile>i; //on dépile dans i
cout<<"pile="<<*ptPile<<"i="<<i; //à l'écran pile=0 i=1
}

Solution:

class BaseListe
{
protected:
int * tab;
int ind;
int taille;
public:
BaseListe(int n=0):taille(n){ind=0; tab=new int[taille];
}
virtual ~BaseListe(void){}
BaseListe& operator< (int i){tab[ind]=i; ind++; taille++; return *this;}
virtual BaseListe& operator> (int& j)
{j=tab[taille-1]; ind--; taille--; return *this;}
friend ostream & operator<<(ostream & o, BaseListe p)
{for (int i=0; i<(p.taille); i++) {o<<p.tab[i]<<" ";}
cout<<endl;
return o;}
};

class ListeLifo : public BaseListe


{
public:
ListeLifo(void){}
~ListeLifo(void){}
};

class ListeFifo :public BaseListe


{
public:
ListeFifo(void){}
ListeFifo& operator> (int& j)
{j=tab[0];
for (int i=0; i<taille; i++) {tab[i]=tab[i+1];} taille--; return *this;}
~ListeFifo(void){}
};

3/3

Vous aimerez peut-être aussi