POURQUOI HERITER - PowerPoint PPT Presentation

1 / 38
About This Presentation
Title:

POURQUOI HERITER

Description:

O l'on propose une application permettant de : Dessiner un carr , un rectangle, un ... peut pas tre virtuel et il ne peut pas appeler de m thode virtuelle. ... – PowerPoint PPT presentation

Number of Views:26
Avg rating:3.0/5.0
Slides: 39
Provided by: gref6
Category:

less

Transcript and Presenter's Notes

Title: POURQUOI HERITER


1
Héritage
2
LES FORMES GEOMETRIQUES
  • Où lon propose une application permettant de
  • Dessiner un carré, un rectangle, un cercle, un
    triangle .
  • Associer au dessin périmètre et surface.

3
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

4
IMPLANTATION
  • double figuresurface(void)
  • switch c
  • case carre return (aa)
  • case rectangle return (ab)
  • . . .

5
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 lapplication
    (Extensibilité)
  • On traite les ellipses

6
COMMENT HERITER ?
  • GESTION DUNE
  • HIERARCHIE DE CLASSES
  • Factorisation
  • Toute 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
    lhypoténuse

7
GRAPHE DHERITAGE
Hérite de
  • Figure
  • Polygone Ellipse
  • Parallélogramme triangle Cercle
  • Rectangle triangle rectangle

8
RELATION DHERITAGE
  • La classe D hérite de la classe M

Héritage simple Un unique ascendant direct
9
HERITAGE PUBLIC
Héritage public Relation  est une sorte de
  • 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)

10
HERITAGE public en C
class D public Méthodes redéfinies void
f(void) Méthodes supplémentaires void
h(void) private Caractéristiques
supplémentaires
public M
  • class M
  • public
  • void f(void)
  • void g(void)
  • private...

L instance W de la classe D a accès à la
section public des classes D et M
11
Partage des caractéristiques
class D public ... private Caractéristiques
supplémentaires
public M
  • class M
  • public
  • ...
  • protected
  • private

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 sils étaient
placés dans sa section private.
12
HERITAGE publicPartage des caractéristiques
public M
class D public protected private
class M public protected private
13
Accès aux caractéristiques
  • class M
  • public
  • ...
  • protected
  • private

14
Accès aux caractéristiques
  • class M
  • public
  • ...
  • protected
  • private

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.
15
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.

16
Les constructeurs
class rectangle public rectangle(double,dou
ble,point) // constructeur par initialisation
//longueur et largeur, centre
class figure public figure (point) //construct
centre private point centre
rectanglerectangle(double a,double b,point
c)figure (c) loa lab
17
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.

18
Les destructeurs
  • Lors de la destruction dune 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.

19
Fonctions surchargées
class M public void f(void) void
g(void) private . . . Protected
public M
public M
20
Fonctions surchargées (Liaison statique)
class M public void f(void) void
g(void) private . . . Protected
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 ?
Liaison statique
21
Fonctions surchargées.Liaison statique
Le type de W1 est D1, par conséquent le
compilateur regarde si la méthode f est dans la
classe D1Si oui, celle-ci est exécutée Si non,
il la recherche dans la première classe
ascendante, etc...
Résolution de la surcharge par liaison statique
22
Héritage et COMPATIBILITE de type
  • class M
  • . . .
  • class D
  • . . .

public 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. Lobjet pointé par ptrM reste de type D.
23
Collection dobjets de types différents
  • figure Dessin4
  • // tableau de pointeurs sur figure
  • Dessin0new carré()
  • Dessin1new rectangle()
  • Dessin2new cercle()
  • Dessin3new triangle()
  • Sur cet exemple, les composants du tableau Dessin
    ont
  • un type statique figure
  • un type dynamique carré ou rectangle ...

24
Liaison statique des fonctions
class figure public void tracer (void)
//action vide class rectangle public
void tracer (void) //rectangle IC est tracé
figure Ptr Ptr new rectangle() Ptr -gt
tracer( )
Le type statique de Ptr est figure. Par
conséquent, linstruction Ptr-gttracer( ) active
la méthode tracer de la classe figure. gt
25
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 lobjet
auquel elle appartient.Exemples f ou tracer
pour les formes géométriques
26
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 -gt
tracer( )
virtual
La fonction tracer est virtuelle. Par conséquent,
linstruction Ptr-gttracer( ) active la méthode
associée au type dynamique de ptr. gt
virtual
27
Les fonctions virtuelles
  • Lors de la redéfinition dune 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.
  • Lexécution des fonctions virtuelles sappuie sur
    une indirection (table de pointeurs de fonctions
    virtuelles).

28
Les fonctions virtuelles
  • 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 nest pas spécifié.

29
Classe abstraite
  • Une classe abstraite est une classe
  • qui ne peut pas être instanciée.
  • Exemple linstantiation de la classe figure na
    pas de sens.

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.
class figure public void tracer(void)

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.
30
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.

31
UTILISATION DUNE CLASSE ABSTRAITE
  • class figure
  • public
  • virtual void tracer (void)0
  • //fonction virtuelle pure

figure F figure Ptr Ptr new figure
// légal
32
HERITAGE PRIVE
Héritage privé
  • 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.

33
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

34
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 ltrectanglegt Dessini) ...

35
HERITAGE privatePartage des caractéristiques
private M
class D public protected private
class M public protected private
36
HERITAGE PRIVE - Exemple
class pileprivate tableau public pile (int
n)// Constructeur void empiler (int) int
depiler (void) int ValSommet (void) bool vide
(void) pile (void)// destructeur private
int sommet
  • class tableau
  • public
  • tableau (void) // Constructeur
  • tableau (const tableau) //const. par copie
  • tableau operator(const tableau)
  • int operator (int)
  • tableau (void) // Destructeur
  • private
  • int T
  • int nb // nombre delements

37
UTILISATION DUNE PILE
class pile private tableau public pile (int
n)// Constructeur void empiler (int) int
depiler (void) int ValSommet (void) bool vide
(void) . . .
void main(void) pile P(10) P.empiler(3) P 2
9
illégal
38
Classe pile (implémentation)
  • pilepile (int n) sommet -1
  • void pileempiler (int e)
  • sommet 1
  • (this) sommete
  • void piledépiler (void) sommet - 1
  • int pileValSommet (void)return (this)
    sommet
  • bool pilevide (void) return sommet -1
Write a Comment
User Comments (0)
About PowerShow.com