Vous êtes sur la page 1sur 52

UNIVERSITE HASSAN II

ECOLE NATIONALE SUPERIEURE


D ELECTRICITE ET DE MECANIQUE

DEPARTEMENT : MATHS-INFO

SUPPORT DE COURS

PROGRAMMATION ORIENTEE OBJET/ C++

Enseignante :
Mme S.Tallal,

Anne Universitaire : 2016-2017


PROGRAMMATION ORIENTEE OBJET

1. INTRODUCTION

2. PRINCIPE

3. ENCAPSULATION

4. CONSTRUCTEURS DESTRUCTEUR

5. HERITAGE

6. POLYMORPHISME

7. AUTRES( FONCTIONS AMIES)

2
INTRODUCTION

La POO est un concept nouveau qui a rapidement envahi le


milieu du dveloppement des logiciels.

Elle est reprsente comme une technologie qui mne une


meilleure intgration des logiciels laugmentation de la
productivit.

De faon gnrale, ce quon attend dun programme


informatique sont les critres suivants:

Lexactitude(rponse aux spcifications)

La robustesse(possibilit dutilisation hors normes )

Lextensibilit(aptitude lvolution)

La rutilisation(utilisation des modules)

La portabilit(sur un autre support)

Lefficience(vitesse dexcution et mmoire)

3
La POO rpond ces diffrentes exigences ; du fait
que ses techniques permettent au programmeur :

Dune part :

Dutiliser des lments du code pralablement


dvelopps cette rutilisation rduit la complexit
du code dvelopp ainsi que le temps et les efforts
ncessaires son dveloppement.

Dautre part

La POO permet lutilisateur et au programmeur de


visualiser les concepts comme une varit dunits
ou dobjets, une hirarchie de composants ou de
structures dorganisation diverses.

La POO permet aux programmeurs de reprsenter facilement


les relations entre les composants, les objets, les tches
accomplir et les conditions remplir.

En rsum, lapproche objet reprsente une nouvelle


mthodologie pour lanalyse et la conception des logiciels
intervenant toutes les phases du cycle logiciel :

De lanalyse de lexistant
la maintenance.

Tout en tant indpendante dun langage de programmation


donn. Ce sont certains langages qui utilisent ses principes tels
que C++, VISUAL BASIC, SMALTEK..
4
Ce qui nous amne dcouvrir les concepts de base et les principales caractristiques de la P
O O que nous appliquerons par la suite au C++ en tant que langage orient objets.

PRINCIPE

-Un programme informatique comporte toujours des


traitements, mais aussi et surtout des donnes.

-Si la programmation structure sintresse aux traitements


puis aux donnes, la conception objet sintresse dabords aux
donnes, auxquelles elle associe ensuite les traitements.

-Les donnes sont ce quil y a de plus stable dans la vie dun


programme, il est donc normal darchitecturer le programme
autour de ces donnes do Le concept de lorient objet
repose sur les notions : dobjet et classe

1. La classe

La classe est la gnralisation du type dfini par lutilisateur


qui permet le regroupement des donnes et des traitements qui
leur sont associs sous une mme entit.

Sous une classe se trouvent associes la fois :

Les donnes
Les fonctions ou procdures relatives ces donnes.

Les fonctions agissent sur les donnes de la classe qui sont


protges de toute ingrence externe.
Une classe gnre une famille dobjets
2. lobjet
5
Lobjet est considr comme une entit cohrente dfinie par
une structure et un comportement.

Dans la ralit, physique ou abstraite, les objets sont prsents


partout : tudiants, employs, avions, des chques.
Dans un systme graphique : des points, des lignes, cercles

La POO manipule ces diffrents objets. Pour chacun dentre


eux, on a besoin dun minimum dinformation sur leur
structure et sur leurs comportements.

Un objet se compose essentiellement de deux parties :

- une partie statique qui regroupe un ensemble de


donnes appele membres donnes
- une partie dynamique qui regroupe les fonctions qui
manipulent ces donnes fonctions membres dune
classe .

les donnes constituent les attributs de lobjet, alors que les


procdures ou fonctions sont des mthodes.

Le mcanisme par lequel lexcution dun programme produit


un objet partir dune classe constitue linstanciation .

Remarque importante :Ne pas confondre classe et objet

6
Caractrisation de lapproche orient objet

La conception par objets est une mthode qui conduit des


architectures logicielles fondes sur des objets que tout
systme manipule. Elle est essentiellement caractrise par :

- Lencapsulation des donnes


- Les constructions dobjets et leur destruction
- Lhritage des attributs et mthodes
- Le polymorphisme

On va juste donner une dfinition succincte de chaque


caractristique, les dtails seront vus ultrieurement en C++.

Lencapsulation : est le mcanisme par lequel le


programmeur cache une partie de linformation pour
prserver lintgrit de lobjet. Il tablit une sparation
entre linterface (publique) et limplmentation
(invisible).

Lhritage : est le procd par lequel une classe, dite


classe drive ou sous-classe, reoit une partie de sa
dfinition dune autre classe, dite classe mre.
Ceci illustre les phnomnes de rutilisation et
dextensibilit.
On peut avoir des hritages simples ou multiples.

Le polymorphisme : cela consiste appeler la bonne


mthode daprs le type de lobjet implment. C--d,
plusieurs classes peuvent possder une mthode de mme
nom. Suivant la nature de lobjet auquel elle doit
sappliquer, on appliquera telle ou telle mthode.

7
Notion dencapsulation

Cest la proprit dun objet de possder des


membres correspondant des donnes.

Elle dsigne le fait quun objet contient la fois


sa description (ou les donnes ) et les mthodes.

lencapsulation signifie que la classe contient :


o une partie statique : un ensemble de donnes,
o une partie dynamique :un ensemble de
fonctions.

Son but : il nest plus ncessaire de connatre la


reprsentation dune la classe , il suffit de
connatre quelles oprations appliquer lobjet.

Elle est lie aux champs qui ne peuvent tre


accessibles que par les mthodes de la classe.

Elle permet de faciliter lajustement dun


programme.

8
Application de la POO au C++

La classe en C++ est la gnralisation de la notion de la


structure du C ; elle comporte :

Des champs ( les donnes )

Des fonctions ( les mthodes agissent sur les donnes )

Le mot cl class permet de dfinir et dclarer la classe.

La classe doit tre dclare avant dtre utilise.

La dclaration dune classe prcise :quels sont ses membres


qui peuvent tre :

publics : laide du mot cl public accessibles


lutilisateur de la classe.

privs : mot cl private inaccessibles en dehors


de la classe.

Rq : Par dfaut les membres sont privs.

Ceci va dans le sens de la protection de linformation savoir


que pour utiliser un objet, il suffit juste de connatre les
mthodes applicables sans connatre la structure de la classe.
9
Exemple :

class point {
private :
int x ;
int y;
public :
void initialisation(int, int) ;
void deplace(int, int) ;
void affiche( ) ;
}; // le ; est indispensable

Dfinition dune classe :

Elle consiste donner les dfinitions des fonctions membres.

Pour cela, on indique le nom de la classe suivant la syntaxe :

type_retour nom_classe :: nom_fc (liste des paramtres)


{ }

Remarque :

La dfinition dune fonction membre peut se faire lintrieur

dune dclaration de classe ou lextrieur laide de

loprateur :: ( Voir les exemples ci_dessous).

10
Exemple 1 : Relatif la dclaration de la classe point

void point :: initialise(int abs, int ord)

{
x = abs ;
y = ord ;
}
// x et y reprsentent implicitement les
// membres dun objet de class point

Exemple 2 : Une classe objet de type article de commerce

class article
{
int num ;
char *nom ;
float prixHT ;
int qte ;

public :
float prixTTC()

{ return prixHT*1.19 ; } // qui calcule le prix TTC

void ajouter(int q)

{ qte = qte + q ; } // augmentation du stock

void retirer( int q)

{ qte = qte q ; } // diminution du stock


};

11
Utilisation d une classe

La syntaxe pour dclarer un objet de type classe dfinie est :

nom_classe liste_des_noms_objets ;

Exemple : point a, b ;
article c, d ;*

On accde nimporte quel membre public ( donne ou


fonction) laide de loprateur . :

Exemple : c.ajouter(50) ;
a.initialise(5,2) ;
x = d.prixTTC() ;

Ces diffrents exemples reprsentent des appels de fonctions


membres des classes point ou article.

Ces objets une fois cres, avant de les exploiter avec les
fonctions membres, il faut souvent les initialiser ou leur
donner une valeur de dpart ; do :

La notion de constructeur.

12
Notions de Constructeurs & Destructeurs

Constructeurs

Relativement un objet de classe il doit exister une opration


caractristique, dont lutilit est de fournir une premire
initialisation cet objet.

La meilleure approche est de dfinir une fonction dont le


rle systmatique est dinitialiser l objet.

Une telle opration est appele constructeur

En C++, Un constructeur est une fonction membre qui


porte le mme nom que sa classe.

Cette fonction membre alloue de la mmoire un objet


et linitialise.

Cette fonction membre ne doit tre prcde ni dun


type donn ni de void .

13
Exemple :

class article
{ .
article(int, char *, float, int) ;
// construit un article de numro, nom,
//prixHT et quantit donne

};

Le mme nom que la classe fait que cette fonction a un


statut spcial c--d :

Toutes les instances de cette classe sont initialises par


cette fonction membre.

Exemple :
article a = article(102, chemise,98.4, 23) ;
article a(102, chemise,98.4, 23) ;

La premire ligne : le constructeur est appel ds la


dclaration pour fournir les valeurs initiales
a est initialis par affectation dune instance cre
par le constructeur.

La deuxime ligne : cest la forme abrge du construc ;


car elle fait appel automatiquement au constructeur.

14
Exemple :
article b = a ;
article c ;

Lobjet (ou instance) b est initialis partir de lobjet


a suppos existant.
Cette criture pour la cration de lobjet c est
incorrecte ; il manque les paramtres du constructeur.

Un objet ne peut tre dclar sans tre


initialis : affectation cre par un constructeur ou
un objet dj existant.

Exemple 1 : Dans le cas dun pointeur sur un objet

article *pa = new article(102,chemise,98.4, 23) ;


Ou
article *pa ;
pa = new article(102,chemise,98.4, 23) ;

new sert allouer de lespace mmoire un pointeur.

Exemple 2 : Le programmeur doit crire du code adquat


pour les constructeurs

article :: article(int n, char *m, float p, int q)


{ numero = n ;
nom = new char[strln(m)] ;
strcpy(nom,m);
prixHT = p; qte = q;
}
15
Possibilit de dfinition dun constructeur lintrieur ou
lextrieur dune classe

Exemple :

class cercle
{
public :
void sortie(void) ;
cercle (float r, float x0, float y0)
{
rayon = r ;
abs_c = x0 ;
ord_c = y0 ;
}
private :
float rayon, abs_c, ord_c ;
float perimetre (void)
{ return 2*M_PI*rayon ; }
float aire(void)
{ return M_PI*rayon*rayon ; }
} ;

void cercle :: sortie(void)


{ .......................}

void main()
{
cercle c(1., 0., 0 ); // dfinition de lobjet c
// avec appel du constructeur
c.cercle() ; // appel de sortie ( fc membre)
}

16
2ime choix : Si on dfinit le constructeur lextrieur
de la classe .

Exemple : cercle :: cercle (float r, float x0, float y0)


{ }

Remarques

I. Quand le constructeur na pas de paramtres


on lappelle constructeur par dfaut .

exemple : cercle ( )
{ rayon =0 ;
abs_c = 0.
Ord_c 0. ;
}
// pas spcialement une mise zro

II. Il est souvent intressant davoir plus dun constructeur


pour initialiser des objets dune classe.

III. Tous les constructeurs ont le mme nom. Ils seront


diffrencis par le nombre et le type des arguments.

Suivant lappel , on sait que cest tel ou tel constructeur


qui est appel( voir exemple ).

17
Exemple : soit une classe date . Voici lappel de
diffrents constructeurs de cette classe :

date( ) ; // date du jour par dfaut

date( int, int, int ) ; // jour , mois , anne

date( char * ) ; // sous forme "12/04/95"

date( int , char *, int ) ; // sous forme 12 Avril 95

18
Destructeur

-Le destructeur est une fonction membre appele


automatiquement lors de la destruction dune instance
dune classe( c--d un objet ).

-Il sert rcuprer la mmoire occupe par un objet.

-Opration parfois ncessaire qui complte utilement un


constructeur.

Comme nombres de classes utilisent de la mmoire


dynamique alloue par les constructeurs, le destructeur
sert rcuprer cette place.

Un seul destructeur par classe

Il porte le mme nom que la classe prcde


du symbole ~ (tilde)

Cette fonction ne reoit aucun argument et


ne retourne aucune valeur.

19
Voici des exemples de dfinition de destructeur :
lextrieur ou lintrieur dune classe.

article :: ~ article( )
{ delete nom ; }

class essai
{
private :
-
public :
-
essai( int )
{ .}

essai( )
{}

~essai( )
{..}
};

A lextrieur de la classe , le destructeur scrit :

essai :: ~essai ( )
{ corps du destructeur }

voir exemple dtude pour lutilisation des


constructeurs et du destructeur.

20
Exemple relatif la classe point :
Dfinition de plusieurs constructeurs. Indiquez quel
constructeur est utilis pour chacun des objets a, b, c.

#include<iostream.h>
#include<conio.h>
class point
{ int x , y ;
public :
point () ; // constructeur 1
point ( int ) ; // constructeur 2
point ( int , int ) ; // constructeur 3
void affiche() ;
};
point :: point ( )
{ x=0 ; y=0 ; }
point :: point ( int abs )
{ x= abs ; y= abs ; }
point :: point (int abs, int ord )
{ x=abs ; y=ord ; }
void point :: affiche ( )
{ gotoxy( x , y) ;
cout<< "je suis en "<<x<<" "<<y<<"\n"<<endl ;}
void main( void )
{ point a , b(5) ;
a.affiche( ) ; b.affiche( ) ;
point c( 3 , 12 ) ;
c.affiche( ) ;
getch( ) ;
}
21
Surcharge des Oprateurs

A travers les fonctions membres constructeurs


et destructeurs, on met en vidence la notion
de surcharge ou de polymorphisme .

Cest la possibilit de donner le mme nom


des fonctions ou des oprateurs.

Do la notion de surcharge des Oprateurs.

En C, certains oprateurs sont surchargs tels


que le + ; Il peut tre utilis pour ajouter
2 nbres entiers ou 2 rels 2 instructions

Car on sait que les entiers et les rels ne sont


pas stocks de la mme manire.

En C++, on peut surcharger des oprateurs


pour amliorer la lisibilit des programmes
On utilise le mot cl : operator

type_rt operator symb_oper(liste_argm) ;

22
complex operator +(complex z, complex u) ;
Exemple : Somme et Produit de 2 complexes.
#include<iostream.h>
#include<conio.h>
typedef struct{ float re ; float im;}complex ;

// surcharge de loperateur +
complex operator +(complex u, complex v)
{ complex z;
z.re = u.re + v.re ;
z.im = u.im + v.im ;
return z; }

// surcharge de loprateur *
complex operator *(complex u, complex v)
{ complex z;
z.re = u.re * v.re - u.im*v.im;
z.im = u.re* v.im + u.im*v.re ;
return z; }

void main()
{ complex z , z1={1. , 1.} , z2={3. , 2.};
z = z1 + z2 ; // somme de 2 complexes
cout<<"z="<<z.re<<"+"<<z.im<<"i"<<endl ;
z = z1 * z2 ; // produit de 2 complexes
23
cout<<"z="<<z.re<<"*"<<z.im<<"i"<<endl ;}
Fonctions Amies

En C++ , lunit de protection est la classe et


non pas lobjet.

C--d, quune fonction membre dune


classe peut accder tous les membres privs
de nimporte quel objet de la classe.

Ces membres privs restent inaccessibles


nimporte quelle fonction membre dune autre
classe ou autre fonction indpendante.

En C++ , les fonctions Amies, appeles


friend, sont des fonctions indpendantes qui
jouissent du privilge suivant :

Pouvoir accder directement aux membres


privs dune classe.

La notion de fc amie ou de dclaration


damiti permet de dclarer dans une classe,

24
les fonctions qui sont autorises accder aux
membres privs( donnes ou fonctions).
Ces foncs sont dclares friend dans la classe.

Exp :

class X
{ int a, b ;
.......
public :
.....
friend void f(...);
..........};

Dans ce cas, f() est une fonction ordinaire


qui peut utiliser les donnes prives de X.

f() nest pas une fonction membres de X

Loprateur :: na pas t appliqu cette


fonction pour la dfinir.

25
Les fonctions amies ont des proprits
particulires qui sont prsentes ci-aprs :
Proprits des Fonctions Amies

Elle est dclare dans une classe,

Peut accder toutes les donnes


prives

Pas affecte par les droits


daccs ( public et private )

Ce nest pas une fonction membre de la


classe

La principale utilisation de ce type de


fonctions rside dans la surdfinition
doprateur.

26
Diffrentes situations damiti

Fonction indpendante, amie dune classe A :

class A { .
friend int fct() ;
...........
};

Fonction membre de class B, amie de class A:

class A { private :
.
friend int B :: fct(.) ;
..
};

la fonction fct() membre de B, ayant un


protocole spcifi, est autorise accder aux
membres privs de la classe A.

Pour que ce cas soit valable, il faut faire


attention aux remarques suivantes :

27
- pour bien compiler la dclaration de A et la
dclaration damiti relative fct(), la
dclaration de la classe B doit prcder
(pas obligatoirement sa dfinition )

- souvent la fonction amie a une valeur de


retour de type A, pour compiler sa
dclaration, le compilateur doit au pralable
connatre A comme classe (class A ;)

- Pour compiler la dfinition dune fc amie,


le compilateur devra possder les
caractristiques de A , c--d sa dclaration.

Toutes les foncs membres de B sont amies de A

Plutt que dutiliser autant de dclarations


damiti que de fonctions membres,
on utilise la dclaration globale suivante :
friend class B ;
pour compiler la dclaration de A on prcise
que B est une classe ( class B ;)
pour compiler la dclaration de B, elle
ncessite la dclaration de A.
28
Lintrt des Fonctions Amies

Lintrt des fonctions amies intervient


pour crire des fonctions types routines.
exemple : imprimer(article) ;

-Cette fonction utilise des objets sans pour


autant en faire une fonction membre.

-En gnral, une fonction Amie na pas


besoin de modifier ltat dun objet.

-Cest une fonction qui peut tre Amie de


plusieurs classes la fois(voir ex ci-dessous)

/* produit d1 matrice par 1 vecteur */


class matrice { float m[3][2] ;
friend vecteur prod(matrice, vecteur) ;
..} ;
class vecteur { float[2] ;
friend vecteur prod(matrice, vecteur) ;
..} ;

vecteur prod( matrice a, vecteur b)


{ // multiplication de a.m par b.v }
29
Exercice : soit la classe suivante

Class point
{ int x , y ;
public :
point(int abs=0, int ord=0)
{ x=abs ; y=ord ; }
~point()
{cout<<"destruction_objets"<<endl ; }
friend void affiche( point & ) ; } ;

Ecrire une fonction affiche(), amie de la


classe point qui affiche les coords dun point.
Ecrire un programme C++ qui:
-cre un point de la classe automatiquement,
-cre un point de la classe dynamiquement
-et qui affiche leurs coordonnes.

// point1.h pour stocker la classe


// source test_point.cpp
#include<iostream.h>
#include<coinio.h>
#include"point1.h"

30
// dfinition de la fonction Amie afficher( )

void affiche( point &p)


{ cout <<" les coordonnes sont :
p.x << " , " << p.y << endl; }

// dfinition de la fonction principale

void main(void)
{ point a(1 , 5);
affiche( a );
point *adp ;
adp = new point( 2, 12) ;
affiche( *adp) ;
delete ;
getch() ;
}

On peut faire dun oprateur surcharg une


fonction amie dune classe. Cest le rle
principal dune fonction amie.

On reprend lexemple des complexes avec la


classe cplex :

31
class cplex
{ double re, im ;
friend cplex operator +(cplex &, cplex &) ;
friend cplex operator * (cplex &, cplex &) ;
public :
complex ( double r=0, double i=0 )
{ re = r ; im = i ; }
.............
};

cplex u( 1 , 2 ) , v( 3 , 4 ) , w ;

un oprateur est reconnu avec operator


lappel de loprateur surcharg se fait par
le signe lui-mme
w = u + v

et est interprt comme operator + ( u , v)


loprateur + surcharg est transform
en une fonction amie dont la dfinition est la
suivante :

friend cplex operator +(cplex &a , cplex &b)


{ return cplex( a.re + b.re , a.im + b.im ) ;}

32
Hritage

Lhritage est une relation entre diffrentes


classes permettant de dfinir une nouvelle
classe en se basant sur des classes existantes.

Le concept de lhritage est le concept


novateur le plus puissant de la POO.

Lorsquune classe Y hrite directement ou


indirectement dune classe X , on dit que :

-Y est une classe drive ou descendante de


la classe X

-X est une classe mre ou anctre de la


classe Y.

Sur un schma, la relation hritage se


reprsente par une flche partant de lhritier
vers lanctre.

33
Cette notation est dite schma de Meyer .

Si une telle relation existe entre X et Y alors


Y se comporte de deux partis :

La partie hrite ou drive de X


La partie incrmentale ou ajoute.

Lhritage est schmatis comme suit :

Partie hrite
Partie ajoute
34
Exemple :

figure ferme

polygone ellipse

rectangle triangle cercle

losange carr tgle_r tgle_i tgle _

35
Exemple :
article

numero
nom
prix_HT
qte
prixTTC( )
ajouter ( )
retire ( )

vetement audiovisuel

taille duree_garantie
coloris valider_gar()
prixTTC( )

TV

Voltage

36
- On a une classe gnrale "article" dfinissant
les caractristiques de tous les articles.

- On spcialise au fur et mesure cette classe


en sous classes ayant des caractristiques
propres elles :

classe vetement ,
classe audiovisuel
et classe TV .

-Un objet "vetement" a 9 caractristiques,


celles de "article" plus "taille" et "coloris".

-Un objet "audiovisuel" a aussi 9 caractris,


celles de "article" avec la modification de
"prixTTC()" plus "duree_garantie" et
"valider_gar()".

- Un objet "TV" a lui 10 caractristiques car


il hrite de la classe "audivisuel" qui elle hrite
de "article" plus "voltage".

37
Loprateur qui nous permet dexprimer une
classe drive dune autre classe est :

suivi optionnellement du mode de drivation,

du nom de la classe anctre(ou mre) et

enfin de la dfinition de la dite classe.

Syntaxe :

class D : private A

{ .. };
ou

class H : public B

{ .............. };

38
typedef enum { S , M , L , XL } SIZE ;

class vetement : public article


{
SIZE taille ;
char coloris[10];
};

on a dclare et dfinit vetement comme une


classe ayant comme membres tous ceux de
article(suppose dfinie) plus les 2 champs
(taille , coloris ) qui sont des donnes prives
propres un objet vetement.

class audiovisuel : public article


{ int duree_garantie ;
public :
void valider_gar() ; };

class TV : public audiovisuel


{
int voltage ; };

39
-La classe audiovisuel hrite de article ;

-TV hrite de audiovisuel et par voie


hirarchique de la classe article .

Remarques Importantes

Une classe drive peut avoir son propre


constructeur.

Si la classe mre a un constructeur, il doit


tre appel en premier.

La dclaration du constructeur dune classe


drive doit donc tenir compte des
paramtres ncessaires linitialisation des
champs provenant de sa classe mre.

Lappel du constructeur de base (de la


classe mre) est appel avant lexcution
du constructeur driv.
40
Exemple :

class vetement : public article


{ ..
public :

vetement ( int, char *, float , int ,


SIZE , char *) ;
// constructeur driv
};

A lextrieur , le constructeur est dfini ainsi :

vetement :: vetement (int n, char *m,


float p, int q, SIZE s , char *c )
: article (n , m , p, q )
{ taille = s ;
strcpy( coloris , s ) ;
}

Lexpression article(n, m, p, q) reprsente


lappel du constructeur de base ou anctre (il
est appel en premier).
41
De faon gnrale, linstanciation dune
classe donne (c--d la cration dobjets de
cette classe) se fait de faon descendante
dans lordre de la hirarchie de lhritage.

De la classe la plus gnrale la classe


particulire.

Exemple :

Pour instancier un objet TV, on crit le


constructeur TV suivant :

TV :: TV(int n, char *m, float p,


int q , int g, int v)

: audiovisuel ( n , m , p , q , g)

{ voltage = v ; }

42
On voit bien que ce constructeur fait appel au
constructeur de la classe dont il drive ;

Qui lui fait appel au constructeur de sa classe


mre (le constructeur article).

Faire trs attention lcriture du code ; il


faut faire bon usage des oprateurs : ::

En ce qui concerne les destructeurs, ils sont


normalement dclars mais appels dans
lordre inverse :

=>de celui de la classe drive dabords


vers ceux de la hirarchie remontante.

Dans une classe drive, une


caractristique qui a le mme nom quune
caractristique de la classe parente masquera
cette dernire en la redfinissant .

43
class B { . X ; } ;

class D : public B
{ .. X; };

Dans D, toute rfrence X concerne la


variable X de D.

Pour adresser X de B, il faut crire

B :: X

Exemple :
void article :: affiche()
{ cout << numero << " " << nom
<< " "<< prix ;
}

La classe ci-dessus est munie dune fonction


affiche() pour laffichage des champs. Do :

44
void audiovisuel :: affich()

{
article :: affiche() ;
cout << " "<<dureegarantie ;
}

void TV :: affiche()

{
audiovisuel :: affiche() ;
cout << " " <<voltage ;
}

Conclusion :

Chaque fonction affiche() redfinit celle


hrite pour imprimer les champs de sa classe.
Pour cela, elle fait appel la fonction affiche()
de la classe mre.

Ce sont dabords les champs hrits qui sont


crits en premiers ensuite sont imprims les
champs propres de la classe drive.
45
Exemple : si v est un objet de type TV
alors v.affiche() sortira les six champs de
v.

Protection des informations - Accessibilit


des membres dune classe

Rappelons que laccessibilit des membres


dune classe peut tre rgle de trois
manires :

Membre priv , private : En dehors de


sa classe, ce membre est inaccessible ;
seules les fonctions membres et les
fonctions amies de sa classe peuvent y
accder.

Membre public , public : nimporte


quelle fonction peut y accder quelle soit
membre ou non de sa classe.

46
Membre protg , protected : Cest un
nouveau type, trs proche du type
private. Il donne laccs un membre
aux seules fonctions membres de sa
classe et des classes drives ainsi
quaux fonctions amies de la classe.

Remarque trs importantes :

Quand on dit membre accessible pour un objet


a dune classe X cest le fait de pouvoir
crire a.membre
( cest laccs un membre champ ou appel
dune fonction membre pour a ).

En C++, lorsquon dfinit une classe en


la faisant driver dune autre classe, la
classe descendante
(drive) hrite de tous les membres de la
classe anctre (mre) quils soient accessibles
ou non ( private, public ou protected ).

47
Lorsquun membre est priv dans une
classe, il nest accessible que dans sa
classe.
Lorsquune classe hrite dune autre
classe X, un membre priv de X ny est
pas accessible bien que dans ce cas il est
membre hrit de la classe X.
On peut rendre nanmoins un membre
private dune classe X public
dans ses sous classes. Pour cela, on le
dclare protected .

Exemple : class X {
.. protected : membres.} ;

Mode de drivation

Le programmeur a la possibilit de changer le


statut daccessibilit des membres hrits au
moment de la dfinition de la classe
descendante .

Voici le tableau qui rsume leffet de mode de


drivation sur le statut des membres de la
48
classe drive en fonction de leur statut dans la
classe mre :

Mode de Statut du Statut du


drivation membre membre
Dans la classe Dans la classe
anctre drive
private inaccessible
private protected private
public private
private inaccessible
protected protected protected
public protected
private inaccessible
public protected protected
public public

Si aucun mode de drivation nest prcis,


cest le mode private par dfaut qui
sapplique.

Exemple : class D : public A


, private B, protected C {......................};

49
// La classe
drive est D et les classes de base sont A,
B ou C.

Drivation Publique : ( class D


: public A )

Les membres public de A sont


membres public de D
Les membres private de A ne sont pas
accessibles aux fonctions membres de
D
Les membres protected de A sont
public pour les fonctions membres de
D et private pour les utilisateurs de D
c--d les autres fonctions.

Drivation Protge : ( class D :


protected C )

Les membres public ou protected de


C sont des membres protected de la
classe drive D.

50
Les membres private de C restent
private dans la classe D donc
inaccessibles aux fonctions membres
de D.

Drivation Prive : ( class D :


private B )

Les membres public ou protected de


B deviennent des membres privs de
la classe drive D donc sont
accessibles juste aux fonctions
membres de D.
Les membres private de B restent
private dans la classe D donc
inaccessibles aux fonctions membres
de D

51
Exercice dapplication : soit la classe suivante

Class point
{ int x , y ;
public :
point(int abs=0, int ord=0)
{ x=abs ; y=ord ; }
};

Ecrire une fonction indpendante affiche(),


amie de la classe point permettant dafficher
les coordonnes dun point.

Ecrire un programme C++ qui cre :

un point de la classe automatiquement,

et un point de la classe dynamiquement

et qui affiche les coordonnes.

52