Upload
carlo-coco
View
4
Download
0
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