Vous êtes sur la page 1sur 16

POO en C++

Heritage multiple
C++ autorise lhritage multiple : une classe peut hriter de plusieurs autres classes Exemple la classe pointcol hrite simultanment des classes point et coul : class pointcol : public point, public coul // chaque drivation, ici publique // pourrait tre prive ou protge { // dfinition des membres supplmentaires (donnes ou fonctions) // ou redfinition de membres existants dj dans point ou coul} ;

point

coul

pointcol

Heritage multiple
pointcol ( .......) : point (.......), coul (.......) || || || arguments arguments arguments L'appel constructeurs est dans l'ordre o les classes de base sont dclares dans la classe drive (ici, point puis coul) la fonction affiche de pointcol sera : void affiche () { point::affiche () ; coul::affiche () ; } Si les fonctions daffichage de point et de coul se nommaient par exemple affp et affc, la fonction affiche aurait pu s'crire simplement :

void affiche () { affp () ; affc () ; }

Heritage multiple
class A { ..... public : int x ; ..... ..... }; class B { ..... public : int x ; };

class C : public A, public B { ..... }; C possdera deux membres nomms x, l'un hrit de A, l'autre de B. Au sein des fonctions membres de C, on fera la distinction l'aide de l'oprateur de rsolution de porte :: on parlera de A::x ou de B::x.

Les fonctions amies


En C++, lunit de protection est la classe, et non pas lobjet. Cela signifie quune fonction membre dune classe peut accder tous les membres privs de nimporte quel objet de sa classe. En revanche, ces membres privs restent inaccessibles nimporte quelle fonction membre dune autre classe ou nimporte quelle fonction indpendante. La notion de fonction amie, ou plus exactement de dclaration damiti , permet de dclarer dans une classe les fonctions que lon autorise accder ses membres privs (donnes ou fonctions).

Les fonctions amies


Il existe plusieurs situations damiti. Fonction indpendante, amie dune classe Il faut introduire dans la classe point la dclaration d'amiti approprie, savoir : friend type_valeur_retour nom_fct (.,..) ; Exemple

Les fonctions amies


#include <iostream> using namespace std ; class point { int x, y ; public : point (int abs=0, int ord=0) // un constructeur ("inline") { x=abs ; y=ord ; } // dclaration fonction amie (indpendante) nomme coincide friend int coincide (point, point) ; }; int coincide (point p, point q) // dfinition de coincide { if ((p.x == q.x) && (p.y == q.y)) return 1 ; else return 0 ; } main() // programme d'essai { point a(1,0), b(1), c ; if (coincide (a,b)) cout << "a coincide avec b \n" ; else cout << "a et b sont differents \n" ; if (coincide (a,c)) cout << "a coincide avec c \n" ; else cout << "a et c sont differents \n" ; } a coincide avec b a et c sont differents

Les fonctions amies


Fonction membre d'une classe, amie d'une 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 } class A ; class B { ..... int f(char, A) ; ..... }; class A { ..... friend int B::f(char, A) ; ..... }; int B::f(char..., A...) { ..... }

Les fonctions amies


Fonction amie de plusieurs classes
class A { // partie prive ..... // partie publique ..... friend f (A, B) ; ..... }; class B { // partie prive ..... // partie publique ..... friend f (A, B) ; ..... };

void f(A..., B...) { // on a accs ici aux membres privs // de nimporte quel objet de type A ou B }

Les fonctions amies


Toutes les fonctions d'une classe amies d'une autre classe

pour dire que toutes les fonctions membres de la classe B sont amies de la classe A, on placera, dans la classe A, la dclaration : friend class B ; Pour compiler la dclaration de la classe A, il suffira de la faire prcder de : class B ; class B ; class A {// partie prive ..... // partie publique ..... friend class B ; };

Les fonctions amies


Exercice: Soit la classe vecteur3d par : class vecteur3d { float x, y, z ; public : vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0) { x = c1 ; y = c2 ; z = c3 ; } ..... }; crire une fonction indpendante coincide, amie de la classe vecteur3d, permettant de savoir si deux vecteurs ont les mmes composantes

Constructeurs et destructeurs

Destructeurs :fonction membre qui intervient automatiquement lors de la destruction d'un objet. Le destructeur est une fonction membre qui porte mme nom de la classe est prcd d'un tilde (~), et qu'il ne possde aucun argument. un destructeur n'a pas de type de retour (mme pas void) un destructeur ne peut pas avoir d'argument la dfinition d'un destructeur n'est pas obligatoire lorsque celui-ci n'est pas ncessaire Les destructeurs ont en gnral beaucoup moins besoin d'tre dfinis que les constructeurs, c'est donc le destructeur par dfaut qui est appel le cas chant. Toutefois, lorsque les objets sont chans dynamiquement grce des pointeurs ou dans d'autres cas particuliers la dfinition d'un destructeur permettant de nettoyer l'ensemble des objets peut tre indispensable. le destructeur d'un objet cr de faon statique est appel de faon implicite ds que le programme quitte la porte dans lequel l'objet existe le destructeur d'un objet cr de faon dynamique doit tre appel grce au mot cl delete, qui permet de librer la mmoire occupe par l'objet.

Constructeurs et destructeurs
Exemple(objet statique) #include <iostream> using namespace std ; class point { int x, y ; public : point (int abs, int ord) // constructeur { x = abs ; y = ord ; cout << "++ Construction d'un point : " << x << " " << y << "\n" ; } ~point () // destructeur { cout << "-- Destruction du point : " << x << " " << y << "\n" ; } }; point a(1,1) ; // un objet statique de classe point

Constructeurs et destructeurs
main() { cout << "****** Debut main *****\n" ; point b(10,10) ; // un objet automatique de classe point int i ; for (i=1 ; i<=3 ; i++) { cout << "** Boucle tour numero " << i << "\n" ; point b(i,2*i) ; // objets crs dans un //bloc } cout << "****** Fin main ******\n" ; } ++ Construction d'un point : 1 1 ****** Debut main ***** ++ Construction d'un point : 10 10 ** Boucle tour numero 1 ++ Construction d'un point : 1 2 -- Destruction du point : 1 2 ** Boucle tour numero 2 ++ Construction d'un point : 2 4 -- Destruction du point : 2 4 ** Boucle tour numero 3 ++ Construction d'un point : 3 6 -- Destruction du point : 3 6 ****** Fin main ******

Constructeurs et destructeurs
Objet dynamique class point { int x, y ; public : void initialise (int, int) ; void deplace (int, int) ; void affiche ( ) ; }; point * adr ; nous pourrons crer dynamiquement un emplacement de type point (qui contiendra donc ici la place pour deux entiers) et affecter son adresse adr par : adr = new point ; L'accs aux fonctions membres de lobjet point par adr se fera par des appels de la forme : adr -> initialise (1, 3) ; adr -> affiche ( ) ;

Constructeurs et destructeurs
Objet dynamique la suppression de lobjet en question, elle se fera, ici encore, par : delete adr ; Aprs l'allocation dynamique de l'emplacement mmoire requis, l'oprateur new appellera un constructeur de lobjet ; ce constructeur sera dtermin par la nature des arguments qui figurent la suite de son appel, comme dans : new point (2, 5) ; Avant la libration de l'emplacement mmoire correspondant, l'oprateur delete appellera le destructeur.

Vous aimerez peut-être aussi