Vous êtes sur la page 1sur 22

09/01/2016

Programmation Oriente Objet


par C++
ZAKRANI Abdelali
ENSAM CASABLANCA
Anne universitaire 2014-2015

Rappel
La sance dernire
Notion de classe:
dclaration, dfinition et utilisation
Cration et destruction des objets
Constructeur et destructeur
Membre donne statique

Cette sance
Les fonctions amies
Lhritage
ZAKRANI / POO par C++ / 13-14

09/01/2016

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 / MOO par UML / 13-14

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?
ZAKRANI / POO par C++ / 13-14

09/01/2016

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

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.
ZAKRANI / POO par C++ / 13-14

09/01/2016

Notion de Fonction Amie (friend)

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.
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.
ZAKRANI / POO par C++ / 13-14

Situations damitis
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

09/01/2016

Fonction indpendante amie


dune classe

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) ;

(-2,3)

(4,1)

ZAKRANI / POO par C++ / 13-14

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

ZAKRANI / POO par C++ / 13-14

10

09/01/2016

Fonction indpendante amie


dune classe
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 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

};

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

ZAKRANI / POO par C++ / 13-14

12

09/01/2016

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
}
Fonction indpendante (f) amie de deux classes (A et B)
ZAKRANI / POO par C++ / 13-14

13

Toutes les fonctions dune classe


amies dune autre classe

Cest une gnralisation du cas Fonction membre dune


classe, amie dune autre classe.
On effectue une dclaration globale : friend class
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.

ZAKRANI / POO par C++ / 13-14

14

09/01/2016

Exercice
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

ZAKRANI / POO par C++ / 13-14

16

09/01/2016

ZAKRANI / POO par C++ / 13-14

17

Hritage Simple

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

09/01/2016

Hritage Simple

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

Notion dhritage
Point
- x: int
- y: int
+ initialise(int, int)
+ deplace(int, int)
+ affiche()

Pointcol
- couleur : short
+ colore(short)

ZAKRANI / POO par C++ / 13-14

20

10

09/01/2016

Exemple de programme

21

ZAKRANI / POO par C++ / 13-14

Utilisation des membres de la classe


de base dans une classe drive

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?
Pourrions nous dfinir une fonction affichec de la manire
suivante?

Non

void affichec ()
{ cout << "Je suis en " << x << " " << y << "\n" ;
cout << " et ma couleur est : " << couleur << "\n" ;
}

Une mthode dune classe drive na pas accs


aux membres privs de sa classe de base.
ZAKRANI / POO par C++ / 13-14

22

11

09/01/2016

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 << " et ma couleur est : " << couleur << "\n" ;
}

De manire analogue:
void pointcol::initialisec (int abs, int ord, short cl)
{ initialise (abs, ord) ;
couleur = cl ;
}
ZAKRANI / POO par C++ / 13-14

23

Redfinition des membres


dune classe drive
Dans lexemple prcdent, dans chaque classe (point et pointcol)
nous avons une fonction membre qui soccupent de laffichage des
membres donne de sa classe (affiche et affichec).

Dans ces conditions,


pourrions nous garder le mme nom de
fonction pour la classe pointcol?

Oui, on peut leur donner le mme nom condition:


de redfinir la fonction affiche()
Au sein de la redfinition affiche(), on appellera
affiche() de point en utilisant loprateur de rsolution
de porte ::

ZAKRANI / MOO par UML / 13-14

24

12

09/01/2016

Redfinition des fonctions membres dune classe drive

ZAKRANI / POO par C++ / 13-14

25

Appel des constructeurs et des


destructeurs
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

13

09/01/2016

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 ZAKRANI
de A. / POO par C++ / 13-14

27

Transmission dinformations entre


constructeurs
class point
{
public:
point(int, int);
...
};

class pointcol : public point


{
public :
pointcol (int, int, short);
....
};

Alors comment retransmettre point les deux premires


informations reues par pointcol?
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.
ZAKRANI / POO par C++ / 13-14

28

14

09/01/2016

ZAKRANI / POO par C++ / 13-14

29

Contrle des accs

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 ellemme.
ZAKRANI / POO par C++ / 13-14

30

15

09/01/2016

Membres protgs

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


Par exemple, la dfinition dune classe peut prendre
lallure suivante :
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

31

Exemple membres protgs


class point
{ protected :
int x, y ;
public :
point ( ... ) ;
affiche () ;
.....
};

il devient possible de
dfinir, dans pointcol,
une fonction membre
affiche de la manire
suivante :

class pointcol : public point


{ short couleur ;
public :
void affiche ()
{ cout << "Je suis en " << x << " " << y <<
"\n" ;
cout << " et ma couleur est " << couleur <<
"\n" ;
}
ZAKRANI / POO par C++ / 13-14

32

16

09/01/2016

Drivation publique

class pointcol : public point { ... } ;

Statut dans Accs aux


la classe de fonctions
base
membres et
amies de la
classe drive

Accs un
Nouveau statut
utilisateur de la dans la classe
classe drive
drive, en cas de
nouvelle drivation

public

oui

oui

public

protg

oui

non

protg

priv

non

non

priv

ZAKRANI / POO par C++ / 13-14

33

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.
ZAKRANI / POO par C++ / 13-14

34

17

09/01/2016

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


le compilateur aprs une drivation prive de la classe point ?

p.affiche ();
p.deplace (...) ;

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

p.colore (...);

ZAKRANI / POO par C++ / 13-14

35

Hritage multiple

C++ autorise galement lhritage multiple: une classe


pourra hriter de plusieurs classes.

point

couleur

pointcoul

Dans cet exemple


simple: le pointcoul
hrite de deux
classes point et
couleur

ZAKRANI / POO par C++ / 13-14

36

18

09/01/2016

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() {}
};

Dclaration de lhritage multiple


class pointcol: public point, public coul
{ ...
// Au sein de cette classe, nous pouvons dfinir de nouveaux membres}

ZAKRANI / POO par C++ / 13-14

37

Transmission darguments aux


constructeurs de la classe de base

Lentte du constructeur de pointcoul se prsente comme


suit:
pointcoul() : point(), coul()
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.
ZAKRANI / POO par C++ / 13-14

38

19

09/01/2016

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

void affiche ()
{ point::affiche () ;
}

void affiche ()
{ cout<<" Ma couleur : " <<couleur<<endl;
cout<<" Mes coordonees : " <<x<<" " <<y;
}

void affiche ()
{ point.affiche () ;
}

coul::affiche () ;

coul.affiche () ;

ZAKRANI / POO par C++ / 13-14

39

ZAKRANI / POO par C++ / 13-14

40

20

09/01/2016

ZAKRANI / POO par C++ / 13-14

41

Conflit ventuel
Considrons la situation suivante:
A

Quel est
le conflit
dans cette
situation?

correspondant des
dclarations telles que :
class A
{ .....
int x, y ;
};
class B : public A {.....} ;
class C : public A {.....} ;
class D : public B, public C
{ .....
};
ZAKRANI / POO par C++ / 13-14

42

21

09/01/2016

Les classes virtuelles

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

22

Vous aimerez peut-être aussi