héritage
DESCRIPTION
Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier. Héritage. 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. CLASSE FORME. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Héritage](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/1.jpg)
Héritage
Licence InformatiqueBesançon
Méthode et Outils pour la Programmation
Françoise Greffier
![Page 2: Héritage](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/2.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/3.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/4.jpg)
IMPLANTATION
double figure::surface(void){switch c{case carre : return (a*a);case rectangle : return (a*b);. . . }
}
![Page 5: Héritage](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/5.jpg)
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 OBJETSUn cercle (rayon) ne « ressemble » pas à un rectangle (diagonale)
Faciliter l ’extension l’application (Extensibilité)On traite les ellipses
![Page 6: Héritage](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/6.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/7.jpg)
GRAPHE D’HERITAGE
Figure
Polygone Ellipse
Parallélogramme triangle Cercle
Rectangle triangle rectangle
Hérite de
![Page 8: Héritage](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/8.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/9.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/10.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/11.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/12.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/13.jpg)
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 utilisateuraccès aux sections public et protected de la classe M
Classe D
![Page 14: Héritage](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/14.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/15.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/16.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/17.jpg)
Les constructeurs
Héritage simple :Les constructeurs sont activés de la racine de l ’arbre d ’héritage vers les classes dérivéesActivation : d ’un constructeur par défaut (qui doit exister) ou bien appel à un constructeur explicite.
![Page 18: Héritage](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/18.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/19.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/20.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/21.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/22.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/23.jpg)
Collection d’objets de types différents
{ figure* Dessin[4]; // tableau de pointeurs sur figureDessin[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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/24.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/25.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/26.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/27.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/28.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/29.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/30.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/31.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/32.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/33.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/34.jpg)
L ’opérateur dynamic_cast
Opérateur de conversion de typeIl 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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/35.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/36.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/37.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022081604/5681684c550346895dde4680/html5/thumbnails/38.jpg)
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;}