Exercices ACOO
4 – Programmation orientée objet
1. Héritage
On considère les déclarations C++ suivante, qui sont correctement compilées.
class Point {
private:
double x, y;
public:
double GetX();
void SetX(double value);
double GetY();
void SetY(double value);
void DisplayProperties();
};
typedef enum { Red = 0, Yellow = 1, Green = 2,
Cyan = 3, Blue = 4, Magenta = 5 } Color;
class ColoredPoint: public Point {
private:
Color color;
public:
Color GetColor();
void SetColor(Color value);
void DisplayProperties();
};
Quels sont les champs et les méthodes que l’on retrouve dans les objets de classe Point, PointCouleur ?
Contenu dans un objet de type
Champs / Méthodes Point ColoredPoint
x GetX
DisplayProperties color
GetColor
Exercices ACOO
2. Appel de méthodes
Les méthodes des classes Point et ColoredPoint sont implémentées de la façon suivante :
// class Point
double Point::GetX() {
return x;
}
void Point::SetX(double value) {
x = value;
}
double Point::GetY() {
return y;
}
void Point::SetY(double value) {
y = value;
}
void Point::DisplayProperties() {
cout << "{ X: " << x << " ; Y: " << y << "}";
}
// class ColoredPoint
void ColoredPoint::DisplayProperties() {
cout << "{ X: " << GetX() << " ; Y: " << GetY() <<
" ; Color: " << color << "}";
}
Color ColoredPoint::GetColor() {
return color;
}
Exercices ACOO Qu’affichera le programme ci-dessous ?
int main() {
Point p1;
ColoredPoint p2;
p1.SetX(1.0);
p1.SetY(0.0);
p2.SetX(0.0);
p2.SetY(2.0);
p2.SetColor(Blue);
cout << "P1: ";
p1.DisplayProperties();
cout << endl;
cout << "P2: ";
p2.DisplayProperties();
cout << endl;
return 0;
}
Exercices ACOO
3. Méthodes virtuelles
On modifie le programme de la façon suivante : void test(const char * name, Point & p) {
cout << name << ": ";
p.DisplayProperties();
cout << endl;
}
int main() {
Point p1;
ColoredPoint p2;
p1.SetX(1.0);
p1.SetY(0.0);
p2.SetX(0.0);
p2.SetY(2.0);
p2.SetColor(Blue);
test("P1", p1);
test("P2", p2);
return 0;
}
Ce programme produit l’affichage suivant :
Etonnamment, l’affichage obtenu ne mentionne pas la couleur pour le point p2.
Il suffit de modifier une seule ligne dans l’ensemble du code source pour que l’affichage du point p2 fonctionne correctement, (et inclut bien l’affichage de la couleur).
Quel mécanisme du C++ faut il utiliser, et quelle modification faut-il apporter
Exercices ACOO
4. Passage par valeur et par référence
Le programme fonctionne maintenant correctement.
Le programmeur choisit finalement d’utiliser un passage de paramètre par valeur plutôt que par référence pour la fonction test. Le seul changement apporté se trouve au niveau du prototype de la fonction test:
void test(const char * name, Point p) {
cout << name << ": ";
p.DisplayProperties();
cout << endl;
}
int main() {
Point p1;
ColoredPoint p2;
p1.SetX(1.0);
p1.SetY(0.0);
p2.SetX(0.0);
p2.SetY(2.0);
p2.SetColor(Blue);
test("P1", p1);
test("P2", p2);
return 0;
}
Après cette modification, l’affichage obtenu est le suivant :
Pourquoi la couleur n’est elle plus affichée pour le point P2 ?