Professional Documents
Culture Documents
Fabio Hernandez
Fabio.Hernandez@in2p3.fr
Vue d'Ensemble
}
}
}
}
}
}
}
}
}
}
}
}
}
}
Notions de base
Types, variables, oprateurs
Contrle d'excution
Fonctions
Mmoire dynamique
Qualit du logiciel
Evolution du modle objet
Objets et classes
Fonctions membres
Classes gnriques
Hritage
Polymorphisme
Hritage multiple
Entre/sortie
401
Motivation
Affectation polymorphe
Structures de donnes polymorphes
Liaison statique
Liaison dynamique
Mthodes abstraites
Classes abstraites
Rsum
402
Motivation
}
403
Motivation (suite)
}
404
Contrle d'Avancement
9 Motivation
0Affectation polymorphe
} Structures de donnes polymorphes
} Liaison statique
} Liaison dynamique
} Mthodes abstraites
} Classes abstraites
} Rsum
405
Affectation Polymorphe
Figure
ClosedFigure
OpenFigure
Segment
Polyline
Polygon
Rectangle
Triangle
Ellipse
...
Circle
Square
POO en C++: Polymorphisme
406
407
soit la fonction
void inspect(const Polygon& aPolygon)
{
// Do something with the parameter object
}
408
409
Contrle d'Avancement
9 Motivation
9 Affectation polymorphe
0Structures de donnes polymorphes
} Liaison statique
} Liaison dynamique
} Mthodes abstraites
} Classes abstraites
} Rsum
410
Soit le tableau
Polygon* polygonArray[4];
polygonArray[0] = new Rectangle;
polygonArray[1] = new Square;
polygonArray[2] = new Triangle;
polygonArray[3] = new Polygon;
411
412
413
Classe Polygon
#include "Point.h"
#include "List.h"
class Polygon {
public:
// Constructors/Destructor
Polygon();
~Polygon();
// Modifiers
void translate(float horizontal, float vertical);
void rotate(float angle);
...
414
415
416
Classe Rectangle
side2
#include "Point.h"
#include "Polygon.h"
side1
origin
// Modifiers
...
POO en C++: Polymorphisme
417
418
Fonctions et
donnes membres
spcifiques la
classe Rectangle
419
Contrle d'Avancement
9 Motivation
9 Affectation polymorphe
9 Structures de donnes polymorphes
0Liaison statique
} Liaison dynamique
} Mthodes abstraites
} Classes abstraites
} Rsum
420
Liaison Statique
}
}
Static Binding
La liaison est le mcanisme utilis par le compilateur pour
dterminer quelle fonction membre appeler sur un objet qui
appartient une hirarchie de classes lorsqu'il y a redfinition
de mthodes
Exemple
Rectangle rect(Point(0.0, 1.0), 10.0, 15.0);
Polygon poly;
float perimeter;
perimeter = rect.perimeter();
// Rectangle::perimeter() is called
perimeter = poly.perimeter();
// Polygon::perimeter() is called
421
Exemple (suite)
Polygon* polyPtr = &poly;
perimeter = polyPtr->perimeter();
// Polygon::perimeter() is called
Rectangle* rectPtr = ▭
perimeter = rectPtr->perimeter();
// Rectangle::perimeter() is called
polyPtr = ▭
perimeter = polyPtr->perimeter();
// Rectangle::perimeter() or Polygon::perimeter()?
422
Exemple (suite)
423
424
Contrle d'Avancement
9 Motivation
9 Affectation polymorphe
9 Structures de donnes polymorphes
9 Liaison statique
0Liaison dynamique
} Mthodes abstraites
} Classes abstraites
} Rsum
425
Liaison Dynamique
}
426
427
428
}
}
429
Classe Polygon
class Polygon {
public:
// Constructors/Destructor
...
// Modifiers
...
// Selectors
virtual float perimeter() const;
virtual float area() const;
...
Dfinition des
fonctions membres
Perimeter et area
comme ayant liaison
dynamique
private:
// Data members
...
};
POO en C++: Polymorphisme
430
431
Classe Rectangle
class Rectangle: public Polygon {
public:
// Constructors/Destructor
...
// Modifiers
...
// Selectors
virtual float perimeter() const;
virtual float area() const;
virtual float diagonal() const;
...
private:
// Data members
...
};
POO en C++: Polymorphisme
432
Propagation pour
clart de la
dfinition des
fonctions membres
Perimeter et area
comme virtual.
Dfinition de la
mthode diagonal
comme virtual.
Affecte toutes les
sous-classes de
Rectangle
1997-2003 Fabio HERNANDEZ
Calcul du primtre
}
l'algorithme
float total = 0.0;
for (int pos=0; pos < MaxPositions; pos++)
total += polygonArray[pos]->perimeter();
appellera Rectangle::perimeter(),
Square::perimeter(), Triangle::perimeter() et
Polygon::perimeter()
POO en C++: Polymorphisme
433
Destructeur Virtuel
}
}
}
434
Le destructeur doit
tre dclar
virtual.
// Selectors
...
private:
// Data members
...
};
POO en C++: Polymorphisme
435
436
Contrle d'Avancement
9 Motivation
9 Affectation polymorphe
9 Structures de donnes polymorphes
9 Liaison statique
9 Liaison dynamique
0Mthodes abstraites
} Classes abstraites
} Rsum
437
Mthodes Abstraites
}
Un tel service est facilement implment pour certaines sousclasses de Polygon (Triangle, Rectangle, Square)
L'implmentation est plus difficile pour un polygone gnrique
438
439
440
Mthode Abstraite
ou virtuelle pure
// Modifiers
...
// Selectors
virtual bool isInside(const Point& aPoint) const = 0;
...
private:
// Data members
...
};
POO en C++: Polymorphisme
441
Contrle d'Avancement
9 Motivation
9 Affectation polymorphe
9 Structures de donnes polymorphes
9 Liaison statique
9 Liaison dynamique
9 Mthodes abstraites
0Classes abstraites
} Rsum
442
Classe Abstraite
}
443
444
445
Contrle d'Avancement
9 Motivation
9 Affectation polymorphe
9 Structures de donnes polymorphes
9 Liaison statique
9 Liaison dynamique
9 Mthodes abstraites
9 Classes abstraites
0Rsum
446
Rsum
}
447