38
Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Embed Size (px)

Citation preview

Page 1: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Héritage

Licence InformatiqueBesançon

Méthode et Outils pour la Programmation

Françoise Greffier

Page 2: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

LES FORMES GEOMETRIQUES

Où l’on propose une application permettant de : Dessiner un carré, un rectangle, un cercle, un

triangle …. Associer au dessin : périmètre et surface.

Page 3: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

CLASSE FORME

enum categorie { carre, rectangle, cercle, triangle};

class figure{public:

. . .void dessiner (void);double périmètre (void);double surface (void);. . .

private :categorie c;double a,b;point centre;

};

Page 4: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

IMPLANTATION

double figure::surface(void)

{switch c

{

case carre : return (a*a);

case rectangle : return (a*b);

. . .

}

}

Page 5: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

POURQUOI HERITER ?

Relier des objets entre eux (famille)

Factoriser des traitements (Réutilisabilité)Représenter le centre de la figure (généralisation)

IDENTIFICATION DES OBJETS

Un cercle (rayon) ne « ressemble » pas à un rectangle (diagonale)

Faciliter l ’extension l’application (Extensibilité)On traite les ellipses

Page 6: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

COMMENT HERITER ?

GESTION D’UNE

HIERARCHIE DE CLASSES FactorisationToute figure géométrique a un centre

Spécialisation (un objet est un cas particulier d ’un autre objet)Un carré est un cas particulier de rectangle

Enrichissement (un objet a des propriétés propres)Un triangle rectangle comprend le calcul de l’hypoténuse

Page 7: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

GRAPHE D’HERITAGE

Figure

Polygone Ellipse

Parallélogramme triangle Cercle

Rectangle triangle rectangle

Hérite de

Page 8: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

RELATION D’HERITAGE

La classe D hérite de la classe M

MClasse mère

DClasse dérivée

Héritage simple :Un unique ascendant direct

Page 9: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

HERITAGE PUBLIC

• Les classes dérivées héritent de la classe mère en se spécialisant • Les membres public de la classe mère deviennent des membres public des classes dérivées. • Les classes dérivées peuvent avoir des membres supplémentaires.(enrichissement)

Héritage public Relation : « est une sorte de »

Page 10: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

HERITAGE public en C++

class M{public :void f(void);void g(void);

private:...

};

class D:

{public :

Méthodes redéfinies : void f(void);

Méthodes supplémentaires :

void h(void);

private: Caractéristiques supplémentaires };

public M

L ’instance W de la classe D a accès à la section public des classes D et M

Page 11: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Partage des caractéristiques

class M{public :

...protected :

private:

};

class D:

{public :

...

private:

Caractéristiques supplémentaires

};

public M

Pour la classe D : les membres de la section protected de la classe mère M sont accessibles par ses fonctions membres et fonctions amies

Pour la classe M : les membres de la section protected se comportent comme s’ils étaient placés dans sa section private.

Page 12: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

HERITAGE : publicPartage des caractéristiques

class M{public :

protected:

private :

};

class D :{public :

protected:

private :

};

public M

Partie inaccessiblehéritée

Page 13: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Accès aux caractéristiques

class M{public :

...protected :

private:};

class D:

{public :

...

private:

Caractéristiques supplémentaires

};

public M

(ex: fonction main) accès aux sections public des classes M et D

Vision utilisateur

accès aux sections public et protected de la classe M

Classe D

Page 14: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Accès aux caractéristiques

class M{public :

...protected :

private:};

class D:

{public :

...

private:

Caractéristiques supplémentaires

};

public M

Attention : l ’utilisation du qualificateur protected est contraire au principe d ’encapsulation.Si des modifications sont apportées à la section protected de la classe M alors toutes les classes dérivées qui utilisent l ’accès direct à cette section sont susceptibles de subir des modifications.

Page 15: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Les constructeurs

Lors de la création d ’une instance d ’une classe dérivée son constructeur et tous les constructeurs de ses classes parentes sont activés.

• Comme un objet d'une classe dérivée est un objet de la classe de base (classe mère) plus quelque chose, pour construire un objet de la classe dérivée il faut au préalable construire la partie de l'objet correspondant à la classe de base.

Page 16: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Les constructeurs

class figure

{public :

figure (point);

//construct :centre

private :

point centre;

};

rectangle::rectangle(double a,double b,point c):figure (c)

{ lo=a;la=b;

}

public figureclass rectangle :

{ public :

rectangle(double,double,point);// constructeur par initialisation : //longueur et largeur, centre

};

Appel du constructeur de la classe mère

Page 17: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Les constructeurs

Héritage simple :

Les constructeurs sont activés de la racine de l ’arbre d ’héritage vers les classes dérivées

Activation : d ’un constructeur par défaut (qui doit exister) ou bien appel à un constructeur explicite.

Page 18: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Les destructeurs

Lors de la destruction d’une instance d ’une classe dérivée son destructeur et tous les destructeurs de ses classes parentes sont activés.

Héritage simple : Les destructeurs sont activés de la classe dérivée

vers la racine de l ’arbre d ’héritage.

Page 19: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Fonctions surchargées

class M{public :void f(void);void g(void);private :

. . .Protected :};

class D1:

{public :

void f(void);

void h(void);

private:

Caractéristiques supplémentaires

};

class D2:

{public :

void f(void);

void k(void);

private:

Caractéristiques supplémentaires

};

public M public M

Page 20: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

class M{public :void f(void);void g(void);private :

. . .Protected :};

Fonctions surchargées (Liaison statique)

D1 w1;

D2 w2;

w1.f( );

w2.g( );

Vision utilisateur

class D1:

{public :

void f(void);

void h(void);...};

public M class D2:

{public :

void f(void);

void k(void);

…};

public M

Liaison statique

Comment dans une hiérarchie par héritage, le compilateur sélectionne la méthode polymorphe à exécuter parmi les surcharges incluses dans la hiérarchie de classes ?

Page 21: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Fonctions surchargées.Liaison statique

Résolution de la surcharge par liaison statique

D1 w1;

D2 w2;

w1.f( );

w2.g( );

Vision utilisateurClasse M

ClasseD1

ClasseD2

Le type de W1 est D1, par conséquent le compilateurregarde si la méthode f est dans la classe D1Si oui, celle-ci est exécutéeSi non, il la recherche dans la première classe ascendante, etc...

Page 22: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Héritage et COMPATIBILITE de type

class M

{ . . .

};

class D:

{ . . .

};

M* ptrM;D d;

ptrM=&d;

D* ptrD;

M m;

ptrD=&m;

On dit que le type statique(déclaré) de *ptrM est M.On dit que le type dynamique (réel) de *ptrM est D.L’objet pointé par ptrM reste de type D.

Vision utilisateur

public M

Page 23: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Collection d’objets de types différents

{ figure* Dessin[4];

// tableau de pointeurs sur figure

Dessin[0]=new carré();

Dessin[1]=new rectangle();

Dessin[2]=new cercle();

Dessin[3]=new triangle();}

Sur cet exemple, les composants du tableau Dessin ont

un type statique = figureun type dynamique = carré ou rectangle ...

Page 24: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Liaison statique des fonctions

class figure

{ public :

void tracer (void) { } //action vide

};

class rectangle:

{ public :

void tracer (void);//rectangle IC est tracé

};

public figure

figure* Ptr;

Ptr = new rectangle();Ptr -> tracer( );

Vision utilisateur

Le type statique de *Ptrest figure. Par conséquent, l’instruction Ptr->tracer( ) active la méthode tracer de la classe figure.=> Action vide

Page 25: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Polymorphisme

La liaison dynamique est un mécanisme distinct (bien qu'étroitement lié) de l'héritage. C'est le fait qu'un nom de fonction membre d'une classe de base (classe mère) peut être associé à une fonction membre d'une classe dérivée. Ce mécanisme est essentiel dans la POO. Il permet de reléguer la réalisation d'une fonction membre à un descendant. Le polymorphisme : grâce à la liaison dynamique, un même nom de fonction pourra correspondre à des réalisations différentes suivant les classes dérivées.

Le polymorphisme offre la possibilité d ’associer à une méthode un code différent selon l’objet auquel elle appartient.Exemples : f ou tracer pour les formes géométriques

Page 26: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Liaison dynamique des fonctionsFonctions virtuelles

class figure

{ public :

void tracer (void) { } //action vide

};

class rectangle : public figure

{ public :

void tracer (void);

// instance courante est tracée

};

figure* Ptr;

Ptr = new rectangle( );Ptr -> tracer( );

Vision utilisateur

La fonction tracer est virtuelle.Par conséquent, l’instruction Ptr->tracer( ); active la méthode associée au type dynamique de *ptr.=> Tracé du rectangle

virtual

virtual

Page 27: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Les fonctions virtuelles

Lors de la redéfinition d’une fonction virtuelle: Les fonctions virtuelles doivent avoir la même

liste de paramètres. Les types de retour sont égaux ou sont des

pointeurs compatibles.

L’exécution des fonctions virtuelles s’appuie sur une indirection (table de pointeurs de fonctions virtuelles).

Page 28: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Classes dérivées : Tout comme une fonction ordinaire une fonction

virtuelle sert de fonction par défaut dans les classes dérivées.

Une fonction virtuelle redéfinie dans une classe dérivée reste virtuelle dans la classe dérivée même si cela n’est pas spécifié.

Les fonctions virtuelles

Page 29: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Classe abstraite

Une classe abstraite est une classe

qui ne peut pas être instanciée.Exemple : l’instantiation de la classe figure n’a pas de sens.

class figure

{ public :

void tracer(void) ;

};

Une classe abstraite est une classe qui contient au moins une méthode virtuelle pure, ou qui n'a pas redéfinit une méthode virtuelle pure.

virtual =0//méthode virtuelle pure

Une méthode virtuelle pure est une méthode virtuelle dont le corps est explicitement non donné, on précise un =0 a la fin du prototype d'une telle méthode.

Page 30: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Méthode virtuelle pure

Une classe abstraite est une classe dont aucun objet de ce type ne peut être créé. Ainsi l'abstraction de la classe se propagera dans les classes dérivées tant que la(les) méthode(s) virtuelle(s) pure(s) n'auront pas été redéfinie(s). Cela est relativement pratique dans le cas d'une classe définissant un concept général, et non une classe en elle même.Lorsqu'une classe définit une méthode virtuelle, le destructeur (s'il est défini) doit être obligatoirement virtuel (sinon on risque de n'appeler que le destructeur de la classe mère alors qu'il s'agit d'un objet de la classe fille).Attention !! Un constructeur ne peut pas être virtuel et il ne peut pas appeler de méthode virtuelle.

Page 31: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

UTILISATION D’UNE CLASSE ABSTRAITE

class figure

{ public :

virtual void tracer (void)=0;

//fonction virtuelle pure

};

figure F;

figure* Ptr;

Ptr = new figure;

Vision utilisateur

//illégal

//illégal

// légal

Page 32: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

HERITAGE PRIVE

La classe D hérite de la classe M

MClasse mère

DClasse dérivée

Héritage privé : La classe D restreint les fonctionnalités de M • Les membres public de la classe mère et protégés de la classe mère deviennent des membres privés des classes dérivées. • Les classes dérivées peuvent avoir des membres supplémentaires.

Héritage privé

Page 33: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Héritage et contrôle d'accès

Une classe dérivée dans sa déclaration spécifie de quelle(s) classe(s) elle hérite mais précise aussi le contrôle d'accès des membres hérités : dans tous les cas, ne peut être accessible dans la classe dérivée que la partie publique ou protégée de la classe de base si l'héritage est public, les membres publics et protégés de la classe de base sont respectivement publics et protégés dans la classe dérivée si l'héritage est privé, les membres publics et protégés de la classe de base sont privés dans la classe dérivée si l'héritage est protégé, les membres publics et protégés sont protégés dans la classe dérivée. on peut déclarer une classe dérivée comme friend dans la classe de base, permettant ainsi l'accès à tous les membres de la classe de base. par défaut, l'héritage est privé pour une class et public pour une struct

Page 34: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

L ’opérateur dynamic_cast

Opérateur de conversion de type

Il a pour rôle d ’effectuer une conversion de type que si elle est réalisable au moment de l ’exécution. Il y a donc vérification du type REEL de l ’instance converti à l ’exécution.

Opérateur appliqué sur un pointeur (Retourne NULL si la conversion échoue) ou sur une référence (Exception bad_cast à lever si conversion

échoue sur une référence).

Exemple :

if(dynamic_cast <rectangle*> Dessin[i]) ...

Page 35: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

class M{public :

protected:

private :

};

class D :{public :

protected:

private :

};

private M

Partie inaccessiblehéritée

HERITAGE : privatePartage des caractéristiques

Page 36: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

HERITAGE PRIVE - Exemple

class tableau{public:

tableau (void); // Constructeurtableau (const tableau&); //const. par copie

tableau& operator=(const tableau&); int& operator [ ](int);~tableau (void); // Destructeur

private :int * T;int nb; // nombre d’elements

};

class pile:private tableau

{public:

pile (int n);// Constructeur

void empiler (int) ;

int depiler (void);

int ValSommet (void);

bool vide (void);

~pile (void);// destructeur

private :

int sommet;

};

Page 37: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

UTILISATION D’UNE PILE

void main(void)

{ pile P(10);

P.empiler(3);

P [2] = 9;

}

Vision utilisateurclass pile: private tableau

{public:

pile (int n);// Constructeur

void empiler (int) ;

int depiler (void);

int ValSommet (void);

bool vide (void);

. . .

};

illégal

Page 38: Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier

Classe pile (implémentation)

pile::pile (int n) {sommet = -1;}

void pile::empiler (int e)

{sommet += 1;

(*this) [sommet]=e;}

void pile::dépiler (void) {sommet -= 1;}

int pile::ValSommet (void){return (*this) [sommet];}

bool pile::vide (void) {return sommet= = -1;}