Programmation Orientée Objet par C++ Héritage et fonctions amies 2015-2016

Embed Size (px)

DESCRIPTION

cours d'héritage et fonctions amies en C++

Citation preview

  • 09/01/2016

    1

    Programmation Oriente Objet

    par C++

    ZAKRANI Abdelali

    ENSAM CASABLANCA

    Anne universitaire 2014-2015

    ZAKRANI / POO par C++ / 13-14 2

    Rappel

    Notion de classe:

    dclaration, dfinition et utilisation

    Cration et destruction des objets

    Constructeur et destructeur

    Membre donne statique

    Les fonctions amies

    Lhritage

    La sance dernire

    Cette sance

  • 09/01/2016

    2

    ZAKRANI / MOO par UML / 13-14 3

    Introduction

    La P.O.O. pure impose lencapsulation des donnes: les membres privs (donnes ou fonctions) ne sont accessibles

    quaux fonctions membres et seuls les membres publics sont accessibles de lextrieur.

    Une fonction membre peut accder tous les objets de sa classe. Mais, selon le principe dencapsulation, elle ne peut pas accder des donnes prives dune autre classe.

    Cependant cette contrainte savre gnante dans certaines circonstances.

    ZAKRANI / POO par C++ / 13-14 4

    Introduction

    Supposons par exemple que nous ayons dfini une classe vecteur et une classe matrice. Et nous souhaitons alors dfinir une fonction permettant de calculer le produit dune matrice par un vecteur? Pourrions nous dfinir cette fonction comme:

    Fonction membre de la classe vecteur? Fonction membre de la classe matrice? Fonction indpendante?

    Il suffit de rendre publiques les donnes de nos deux classes? Il suffit dintroduire dans les deux classes des fonctions

    publiques permettant daccder aux donnes?

  • 09/01/2016

    3

    ZAKRANI / POO par C++ / 13-14 5

    Introduction

    Fonction membre de la classe vecteur? Oui, nous pourrions ... mais

    Une fonction membre de la classe vecteur ne pourra pas accder aux donnes prives de la classe matrice

    Fonction membre de la classe matrice? Oui, nous pourrions ... mais

    Une fonction membre de la classe matrice ne pourra pas accder aux donnes prives de la classe vecteur Fonction indpendante?

    Oui, nous pourrions ... mais Une fonction indpendante ne pourra pas accder ni aux donnes prives

    de la classe vecteur ni aux donnes prives de la classe matrice

    ZAKRANI / POO par C++ / 13-14 6

    Introduction

    Il suffit de rendre publiques les donnes de nos deux classes? Dans ce cas, nous perdrions alors le bnfice

    de leur protection. Il suffit dintroduire dans les deux classes des fonctions

    publiques permettant daccder aux donnes? Dans ce cas, nous serions alors pnalis en

    temps dexcution...

    La notion de fonction amie propose une solution intressante, sous la forme dun compromis entre encapsulation formelle des donnes prives et des donnes publiques.

  • 09/01/2016

    4

    En C++, lors de la dfinition dune classe, il est en effet possible de dclarer quune ou plusieurs fonctions (extrieures la classe) sont des amies (friend).

    Une telle dclaration damiti les autorise alors accder aux donnes prives, au mme titre que nimporte quelle fonction membre.

    ZAKRANI / POO par C++ / 13-14 7

    Notion de Fonction Amie (friend)

    Lavantage de cette mthode est de permettre le contrle des accs au niveau de la classe concerne: on ne peut pas simposer comme fonction amie dune classe si cela na pas t prvu dans la classe.

    Il existe plusieurs situations damitis :

    Fonction indpendante, amie dune classe ;

    Fonction membre dune classe, amie dune autre classe ;

    Fonction amie de plusieurs classes ;

    Toutes les fonctions membres dune classe, amies dune

    autre classe.

    ZAKRANI / POO par C++ / 13-14 8

    Situations damitis

  • 09/01/2016

    5

    Utilisation dune fonction amie concide qui examine la concidence de deux objets de type point. Introduire dans la classe point la dclaration damiti: friend int coincide (point, point) ;

    ZAKRANI / POO par C++ / 13-14 9

    Fonction indpendante amie

    dune classe

    (-2,3)

    (4,1)

    ZAKRANI / POO par C++ / 13-14 10

    Fonction indpendante amie

    dune classe

    x et y membres donnes de la classe point Visibilit: privs

    Constructeur avec deux valeurs par dfaut

    Dclaration du prototype de la

    fonction amie concide

    Dfinition de la

    fonction amie

    concide

  • 09/01/2016

    6

    Remarques:

    Lemplacement de la dclaration damiti au sein de la

    classe point est absolument indiffrent.

    Gnralement, une fonction amie dune classe

    possdera un ou plusieurs arguments ou une valeur

    de retour du type de cette classe.

    ZAKRANI / POO par C++ / 13-14 11

    Fonction indpendante amie

    dune classe

    Fonction (f) dune classe (B), amie dune autre classe (A)

    ZAKRANI / POO par C++ / 13-14 12

    Fonction membre dune classe, amie

    dune autre classe

    Class A

    {

    // partie prive

    // partie publique

    friend int B::f (char, A);

    };

    class B

    {

    Int f (char, A);

    } ;

    int B::f (char, A) { // on a accs ici aux membres

    // privs de tout objet de type A

    };

  • 09/01/2016

    7

    Fonction indpendante (f) amie de deux classes (A et B)

    ZAKRANI / POO par C++ / 13-14 13

    Fonction amie de plusieurs classes

    Class A

    {

    // partie prive

    // partie publique

    friend void f (A, B);

    };

    Class B

    {

    // partie prive

    // partie publique

    friend void f (A, B);

    };

    void f(A..., B...)

    { // on a accs ici aux membres privs

    // de nimporte quel objet de type A ou B

    }

    Cest une gnralisation du cas Fonction membre dune

    classe, amie dune autre classe.

    On effectue une dclaration globale : friend class

    ZAKRANI / POO par C++ / 13-14 14

    Toutes les fonctions dune classe

    amies dune autre classe

    Class A

    {

    // partie prive

    // partie publique

    friend class B ; };

    Cette dclaration

    signifie que toutes les

    fonctions membres de

    la classe B sont amies

    de la classe A.

  • 09/01/2016

    8

    Ecrire une fonction permettant de dterminer le produit

    dun vecteur (objet de classe vect) par une matrice (objet

    de classe matrice).

    un constructeur pour vect et pour matrice ;

    une fonction daffichage (affiche) pour matrice.

    La fonction produit prod peut tre:

    prod est indpendante et amie des deux classes vect et matrice ;

    prod est membre de matrice et amie de la classe vect.

    ZAKRANI / POO par C++ / 13-14 15

    Exercice

    ZAKRANI / POO par C++ / 13-14 16

  • 09/01/2016

    9

    ZAKRANI / POO par C++ / 13-14 17

    Le concept dhritage constitue lun des fondements de

    la P.O.O

    Il est la base des possibilits de rutilisation de

    composants logiciels

    Il nous autorise dfinir une nouvelle classe, dite

    drive, partir dune classe existante dite de base.

    La classe drive hritera des potentialits de la

    classe de base, tout en lui en ajoutant de nouvelles.

    ZAKRANI / MOO par UML / 13-14 18

    Hritage Simple

  • 09/01/2016

    10

    Bien entendu, plusieurs classes pourront tre drives

    dune mme classe de base.

    En outre, lhritage nest pas limit un seul niveau : une

    classe drive peut devenir son tour classe de base

    pour une autre classe.

    ZAKRANI / MOO par UML / 13-14 19

    Hritage Simple

    Point

    - x: int

    - y: int

    + initialise(int, int)

    + deplace(int, int)

    + affiche()

    ZAKRANI / POO par C++ / 13-14 20

    Notion dhritage

    Pointcol

    - couleur : short

    + colore(short)

  • 09/01/2016

    11

    ZAKRANI / POO par C++ / 13-14 21

    Exemple de programme

    Dans lexemple prcdent, lorsque nous appelons

    affiche pour un objet de type pointcol, nous nobtenons

    aucune information sur sa couleur.

    Alors comment faire pour remdier cette lacune?

    ZAKRANI / POO par C++ / 13-14 22

    Utilisation des membres de la classe

    de base dans une classe drive

    Pourrions nous dfinir une fonction affichec de la manire

    suivante? void affichec ()

    { cout

  • 09/01/2016

    12

    ZAKRANI / POO par C++ / 13-14 23

    Utilisation des membres de la classe

    de base dans une classe drive

    En revanche, une mthode dune classe drive a accs aux membres publics de sa classe de base.

    void pointcol::affichec ()

    { affiche () ;

    cout

  • 09/01/2016

    13

    ZAKRANI / POO par C++ / 13-14 25

    Redfinition des fonctions membres dune classe drive

    Rappel: Sil existe au moins un constructeur, toute cration dun

    objet entranera lappel dun constructeur, choisi en

    fonction des informations fournies en arguments.

    Sil nexiste aucun constructeur, il nest pas possible de

    prciser des informations lors de la cration dun objet

    Sil existe un destructeur, il sera appel avant la

    destruction de lobjet.

    ZAKRANI / POO par C++ / 13-14 26

    Appel des constructeurs et des

    destructeurs

  • 09/01/2016

    14

    ZAKRANI / POO par C++ / 13-14 27

    Appel des constructeurs et des

    destructeurs Class A

    {

    Public:

    A()

    ~A()

    ...

    } ;

    class B: public A

    {

    public :

    B()

    ~B()

    ....

    } ;

    Pour crer un objet de type B:

    Il y a appel au constructeur de A Il y a appel au constructeur de B pour

    complter par ce qui est spcifique B

    Le mme mcanisme sapplique pour la destruction dun

    objet mais le sens inverse destruction dun objet de type B

    puis lappel du destructeur de A.

    Alors comment retransmettre point les deux premires

    informations reues par pointcol?

    ZAKRANI / POO par C++ / 13-14 28

    Transmission dinformations entre

    constructeurs class point

    {

    public:

    point(int, int);

    ...

    } ;

    class pointcol : public point

    {

    public :

    pointcol (int, int, short);

    ....

    } ;

    pointcol (int abs, int ord, char cl) : point (abs, ord)

    la dclaration : pointcol a (10, 15, 3) ; entranera :

    lappel de point qui recevra les arguments 10 et 15 ;

    lappel de pointcol qui recevra les arguments 10, 15 et 3.

  • 09/01/2016

    15

    ZAKRANI / POO par C++ / 13-14 29

    Dans la situation dhritage que nous avons vu:

    La classe drive a accs aux membres publics de la classe de base ;

    Les utilisateurs de la classe drive ont accs ses membres publics, ainsi quaux membres publics de sa

    classe de base.

    En C++, il y a un statuts de visibilit qui sutilise lors de

    la conception de la classe de base: protg (protected)

    Les membre protgs se comportent comme des membres privs pour lutilisateur de la classe drive mais

    comme des membres publics pour la classe drive elle-

    mme.

    ZAKRANI / POO par C++ / 13-14 30

    Contrle des accs

  • 09/01/2016

    16

    Le statut - protg - est dfini par le mot-cl protected.

    Par exemple, la dfinition dune classe peut prendre

    lallure suivante :

    ZAKRANI / POO par C++ / 13-14 31

    Membres protgs

    class X

    { public :

    ..... // partie publique

    protected :

    ..... // partie protge

    private :

    ..... // partie prive

    } ;

    Les membres protgs sont inaccessibles

    lutilisateur de la classe

    Mais ils seront accessibles aux membres

    dune ventuelle classe

    drive

    ZAKRANI / POO par C++ / 13-14 32

    Exemple membres protgs

    class point

    { protected :

    int x, y ;

    public :

    point ( ... ) ;

    affiche () ;

    .....

    } ; class pointcol : public point

    { short couleur ;

    public :

    void affiche ()

    { cout

  • 09/01/2016

    17

    class pointcol : public point { ... } ;

    ZAKRANI / POO par C++ / 13-14 33

    Drivation publique

    Statut dans

    la classe de

    base

    Accs aux

    fonctions

    membres et

    amies de la

    classe drive

    Accs un

    utilisateur de la

    classe drive

    Nouveau statut

    dans la classe

    drive, en cas de

    nouvelle drivation

    public

    protg

    priv

    oui

    oui

    non

    oui

    non

    non

    public

    protg

    priv

    ZAKRANI / POO par C++ / 13-14 34

    Drivation prive

    class pointcol : private point { ... } ;

    class point

    {

    public :

    point();

    void affiche();

    void deplace();

    } ;

    class pointcol : private point

    {

    public :

    pointcol();

    void colore();

    } ;

    En utilisant le mot private, la classe drive pointcol na pas

    laccs aux membres publics de sa classe de base point.

  • 09/01/2016

    18

    Si p est de type pointcol, les appels suivants seront rejets par

    le compilateur aprs une drivation prive de la classe point ?

    ZAKRANI / POO par C++ / 13-14 35

    p.affiche ();

    p.deplace (...) ;

    p.point::affiche ();

    p.point::deplace (...);

    p.colore (...);

    1

    2

    3

    C++ autorise galement lhritage multiple: une classe

    pourra hriter de plusieurs classes.

    ZAKRANI / POO par C++ / 13-14 36

    Hritage multiple

    point couleur

    pointcoul

    Dans cet exemple

    simple: le pointcoul

    hrite de deux

    classes point et

    couleur

  • 09/01/2016

    19

    ZAKRANI / POO par C++ / 13-14 37

    Mise en uvre de lhritage multiple

    class point

    { int x, y;

    public :

    point() {}

    ~point() {}

    void affiche() {}

    } ;

    class coul

    { short couleur;

    public :

    coul() {}

    ~coul() {}

    void affiche() {}

    } ;

    class pointcol: public point, public coul

    { ... // Au sein de cette classe, nous pouvons dfinir de nouveaux membres} ;

    Dclaration de lhritage multiple

    Lentte du constructeur de pointcoul se prsente comme

    suit:

    pointcoul() : point(), coul()

    ZAKRANI / POO par C++ / 13-14 38

    Transmission darguments aux

    constructeurs de la classe de base

    arguments de

    pointcoul

    arguments

    transmettre

    point

    arguments

    transmettre

    coul

    Lordre dappel des constructeurs est le suivant :

    constructeurs des classes de base, dans lordre o les

    classes de base sont dclares dans la classe drive (ici,

    point puis coul) ;

    constructeur de la classe drive (ici, pointcoul).

    Quant aux destructeurs ventuels seront appels dans lordre inverse

    lors de la destruction dun objet de type pointcoul.

  • 09/01/2016

    20

    Comment peut-on dfinir la fonction affiche() de pointcoul?

    ZAKRANI / POO par C++ / 13-14 39

    void affiche ()

    { point::affiche () ; coul::affiche () ;

    }

    void affiche ()

    { cout

  • 09/01/2016

    21

    ZAKRANI / POO par C++ / 13-14 41

    ZAKRANI / POO par C++ / 13-14 42

    Conflit ventuel Considrons la situation suivante:

    B C

    D

    A

    class A

    { .....

    int x, y ;

    } ;

    class B : public A {.....} ;

    class C : public A {.....} ;

    class D : public B, public C

    { .....

    } ;

    correspondant des

    dclarations telles que :

    Quel est

    le conflit

    dans cette

    situation?

  • 09/01/2016

    22

    Dans la situation prcdente, D hritera deux fois de A.

    Pour viter cette duplication de donnes dans D. Nous

    pouvons demander au C++ de nincorporer quune

    seule fois les membres de A dans la classe D.

    Pour cela, il faut prciser, dans les dclarations des

    classes B et C que la classe A est virtuelle (mot-cl

    virtual) :

    class B : public virtual A {.....} ;

    class C : public virtual A {.....} ;

    class D : public B, public C {.....} ;

    ZAKRANI / POO par C++ / 13-14 43

    Les classes virtuelles