CH Patrons Heritage Polymorphisme
CH Patrons Heritage Polymorphisme
CH Patrons Heritage Polymorphisme
min (n, p) = 4
min (x, y) = 2.5
Avec l’appel min (n, p), le compilateur fabriquera (instanciera) la fonction min (dite
fonction patron) correspondant à des arguments de type int.
Même chose pour min avec deux arguments de type float, le compilateur instanciera une
autre fonction patron min correspondant a des arguments de type float, et ainsi de suite.
Le patron min peut être utilisé pour des arguments de n’importe quel type:
Type prédefini (short, char, double, int *, char *, int * *, etc.)
Type défini par l’utilisateur (notamment structure ou classe).
Si n et p sont de type int, un appel tel que min (&n, &p) conduit le
compilateur a instancier une fonction int * min (int *, int *).
Le code:
Le code:
class vect {
int x, y ;
public :
vect (int abs=0, int ord=0) { x=abs ; y=ord; }
void affiche () { cout << x << ”” << y ; }
friend int operator < (vect, vect) ;
};
int operator < (vect a, vect b)
{
return a.x*a.x + a.y*a.y < b.x*b.x + b.y*b.y ;
}
Exemple d’utilisation :
main()
{
vect u (3, 2), v (4, 1), w ;
w = min (u, v) ;
cout << ”min(u, v ) = ”;
w.affiche() ;
}
Sortie :
min (u, v) = 3 2
Si nous cherchons a appliquer notre patron min a une classe pour laquelle
l’opérateur < n’est pas défini, le compilateur le signalera.
Définir une classe pour chaque type des coordonnées!!! Remplacer le mot int
dans la classe point par le type voulu.
Les choses peuvent être simplifiées en définissant un seul patron de classe :
template <class T> class point {
Tx;Ty;
public :
point (T abs=0, T ord=0) ;
void affiche () ;
};
Définition des fonctions membres de la classe, comment?
Il y a deux possibilités.
Fonction en ligne.
N’est pas fonction en ligne.
Rappel : Une classe patron est une instance particulière d’un patron de
classes.
Une classe patron se déclare en fournissant a la suite du nom de patron un
nombre d’arguments effectifs (noms de types) égal au nombre de paramètres
figurant dans la liste du patron.
essai <int, float, int> ce1 ;
essai <int, int *, double > ce2 ;
essai <char *, int, obj> ce3 ;
Dans la dernière déclaration (instanciation de la classe patron), on suppose
que obj est un type préalablement défini.
Possible d’utiliser comme paramètre de type effectif un type instancie a l’aide
d’un patron de classes.
essai <float, int<int>, double> ce4 ;
essai <point<int>, point<float>, char *> ce5;
L’héritage
Exemple :
class point{
int x,y;
public : point(int abs=0, int ord =0){
x=abs; y=ord;
}
∼point(){}
};
class pixel : public point {
short couleur;
public :
pixel(int abs=0,int ord=0,short cl=1):point(abs,ord),
couleur(cl){
}
∼pixel(){
}
};
Le polymorhpisme
L’édition de lien est l’opération qui associe, à l’appel d’une fonction, l’adresse du
code de la fonction.
On distingue
La liaison statique (ou précoce): effectuée à la compilation
La liaison dynamique (ou tardive) : effectuée à l’exécution.
Ici la méthode F prend un argument par valeur. Elle va donc s’exécuter sur
une copie de cet argument.
Il faut passer t par référence pour que la méthode F agisse sur l’instance
d’origine !
void F(Base & t){
t.affiche();
}
main(){
Base b;
Derv d;
F(b);
F(d);
return 0;
}
class Base{
public:
virtual void affiche()=0;
class Derv : public Base{
public:
void affiche(){
cout << ”Derv \ n”;
}
};
Une classe abstraite est une classe contenant au moins une méthode virtuelle
pure.
Elle ne peut être instanciée
Ses sous-classes restent abstraites tant qu’elles ne fournissent pas les
définitions de toutes les méthodes virtuelles pures dont elles héritent