Académique Documents
Professionnel Documents
Culture Documents
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;}
};
3/3