You are on page 1of 28

Plan

Programmations Orientées Objet


C++/Java

Laila AMIR

Filières d’ingénieurs : IAFCS/IRISI:

Année universitaire 2010/2011

Laila AMIR Programmations Orientées Objet


Partie I : Introdution POO
Plan Partie II: C++
Partie III: Java

Partie I : Introdution POO

Laila AMIR Programmations Orientées Objet


Partie I : Introdution POO
Plan Partie II: C++
Partie III: Java

Partie II : C++

1 L’héritage et le polymorphisme en C++


Généralités
L’héritage simple
Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Laila AMIR Programmations Orientées Objet


Partie I : Introdution POO
Plan Partie II: C++
Partie III: Java

Partie III : Java

Laila AMIR Programmations Orientées Objet


Part I

Partie I: Introdution POO

Laila AMIR Programmations Orientées Objet


L’héritage et le polymorphisme en C++

Part II

Partie II: C++

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Qu’est ce que l’héritage

L’héritage est une technique permettant de réutiliser et de spécialiser


les classes existantes.
Il offre la possibilité de créer une classe à partir d’une autre dont
l’objectif est de permettre la définition aisée de sous-types,
correspondant à une spécialisation de types existants.
Il permet d’évoluer les classes sans avoir à les réécrire de A à Z,
Il permet de modulariser et spécialiser les classes au fur à mesure
des besoins,

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Qu’est ce que l’héritage

Il n’est pas nécessaire de disposer du code source de la classe


existante pour en faire dériver une classe fille, il suffit juste
d’avoir le fichier de déclaration de la classe mère (fichier.h) et son
fichier objet (fichier.o),
Le concept d’héritage est aussi connu sous le nom de dérivation des
classes. La classe dont dérive une classe se nomme la classe de base,
la superclasse ou la classe mère ... La classe dérivée se nomme la
classe fille ou la sous-classe.
La classe fille hérite automatiquement des données et méthodes de la
classe mère sans avoir à les reécrire

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Qu’est ce que l’héritage

Une classe mère peut avoir plusieurs


classes filles,
On parle d’héritage simple, quand
une classe fille hérite d’une seule
classe mère, La classe B hérite d’une seule
classe A.

On parle d’héritage multiple,


quand une classe fille hérite
simultanément de plusieurs
classes mères,
La classe C dérive à la fois des
classes A et B.
Laila AMIR Programmations Orientées Objet
Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Syntaxe générale

Pour spécifier en C++ qu’une classe B hérite d’une classe A, on


déclare la classe B de la manière suivante :
class B : <mode dérivation> class A { ... };

L’opérateur : situé juste après le nom de la classe indique que celle-ci


dérive d’une autre classe.
<mode dérivation> le mode de dérivation permet de fixer le statut
des membres (attributs, fonctions) de la classe B en fonction du
statut des membres de la classe A.
Ce statut peut correspondre à une des trois valeurs suivantes : public,
private, protected. Ces étiquettes permettent de spécifier l’héritage.
Le mode de dérivation par défaut est le mode private, mais le mode de
dérivation le plus courant est le mode public.

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

class A{
...;
};

class B1: public A{ class B2: protected A{ class B3: private A{


...; ...; ...;
}; }; };

Le choix de l’étiquette ne change rien pour la classe elle-même (mère)


; la spécification de l’héritage n’intervient que pour les classes filles.
Nous verrons par la suite la signification de chaque étiquette (mode de
dérivation).

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Appel des constructeurs et destructeurs


Les constructeurs et destructeurs obéissent à des règles précises. On peut
transmettre les paramètres du constructeur dérivé au constructeur de base:
class Point {
int x, y;
Point(int a, int b) { x = a; y = b; };
};
class PointCol : public Point {
int couleur;
public:
PointCol(int a, int b, int c) : Point(a,b) {
couleur = c;
};
};

On peut toujours mettre des arguments par défaut.


Laila AMIR Programmations Orientées Objet
Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Appel des constructeurs et destructeurs

Lors de l’appel du constructeur de la classe dérivée, il se produit dans


l’ordre:
appel du constructeur de base,
exécution du corps du constructeur dérivé.
Lors de l’appel du destructeur de la classe dérivée, il se produit dans
l’ordre:
exécution du corps du destructeur dérivé,
appel du destructeur de base.

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Redéfinition de fonctions et données membres


class Point {
int x, y; //sont privés
public: main() {
void affiche() { PointCol p(10, 20, 5);
cout << ”x = <<x<< p.affiche();
”y = ”<<y<<endl; }; p.Point::affiche();
}; };
class PointCol : public Point {
int couleur; p.affiche(); appelle affiche()
void affiche() { de la classe dérivée PointCol;
Point::affiche(); p.Point::affiche(); appelle
cout <<”couleur”<<couleur; affiche() de la classe Point;
};
};
La classe PointCol hérite de la
Lailaclasse
AMIR Point
Programmations Orientées Objet
Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Redéfinition de fonctions et données membres

La fonction affiche() de la classe fille et la classe mère a la même


signature. On dit que affiche() de la classe mère est Redéfinie dans
la classe dérivée.
L’appel de la fonction affiche() dans la classe dérivée est habituelle.
En revanche, pour appeler la fonction affiche() membre de la classe
de base, il faut préciser le nom de la classe de base :: en préfixe.

Interdiction d’accès aux membres privés


Une méthode d’une classe dérivée n’a pas accès aux membres privés de sa
classe de base

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Redéfinition de fonctions et données membres

Interdiction d’accès aux membres privés x, y


Dans l’exemple précédent, on ne peut pas afficher directement x et y avec
”cout” dans la méthode affiche() de PoinCol, mais il faut passer par une
méthode membre publique de la classe Point, c’est le cas d’appel de
Point::affiche()

Possibilité d’accès aux membres protégés


Cependent, si x, et y ont été déclarés protégés (protected) dans la classe
de base, toute méthode membre (ou amie) d’une classe dérivée pouvait y
accéder.

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Redéfinition de fonctions et données membres

Pour les membres données, c’est analogue.

Si b est de type B, b.a fait référence au


membre a de type float de la classe B. class A {
On accède au membre a de type int par b.A::a public :
Le membre a de la classe B s’ajoute à celui de int a; char b;
la classe A. Il ne le remplace pas. ...
};
NB: on dit REdéfinition et pas SURdéfinition.
class B: public A {
(Surdéfinition signifie changement de
float a; ...
signature de la fonction au sein d’une même
};
classe).

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Les modificateurs d’accès (rappel)


Il existe trois modificateurs d’accès :
private : Les membres privés d’une classe ne peuvent être accédées
que par les méthodes membres et les fonctions amies de cette même
classe.
public: Les membres publiques d’une classe peuvent être accédées
par tout le monde (par les méthodes membres de la classe, les
méthodes d’autres classes (amies ou non), les utilisateurs de la classe
(les objets de la classe), ..). .
protected : Les membres protégées d’une classe ne peuvent être
accédées que par les méthodes membres, les fonctions amies, et les
méthodes des classes directement dérivées de cette classe. l’accès par
les méthodes des classes indirectement dérivées (exemple : classe A
qui hérite d’une classe B qui hérite d’une classe C) dépendra du type
d’héritage.
Laila AMIR Programmations Orientées Objet
Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Héritage publique
Syntaxe Les membres publiques de la classe mère
class A{ A restent publiques dans la classe fille B,
... Les membres protégés de la classe mère A
}; restent protégés dans la classe fille B,
class B : public A{
Les membres privés de la classe mère sont
...
inaccéssibles.
};

Statut dans Nouveau statut Accès par les méthodes 1 Accès par
la classe mère dans la classe fille de la classe fille le monde externe2
public public Oui Oui
protected protected Oui Non
private private Non Non
1
: les méthodes membres ou amies de la classe fille.
2
: les méthodes d’autres classes, non amies, objets de la classe fille, ...
Laila AMIR Programmations Orientées Objet
Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Héritage protégé
Syntaxe Les membres publiques de la classe mère
A deviennent protégés dans la classe
class A{
fille B,
...
}; Les membres protégés de la classe mère
class B : protected A{ A restent protégés dans la classe fille B,
... Les membres privés de la classe mère
}; sont inaccéssibles.

Statut dans Nouveau statut Accès par les méthodes Accès par
la classe mère dans la classe fille de la classe fille le monde externe
public protected Oui Non
protected protected Oui Non
private private Non Non

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Héritage privé
Syntaxe Les membres publiques de la classe mère
class A{ A deviennent privés dans la classe fille B,
... Les membres protégés de la classe mère A
}; deviennent privés dans la classe fille B,
class B : private A{
Les membres privés de la classe mère sont
...
inaccéssibles.
};

Statut dans Nouveau statut Accès par les méthodes Accès par
la classe mère dans la classe fille de la classe fille le monde externe
public private Oui Non
protected private Oui Non
private private Non Non

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Compatibilité entre objets d’une classe de base et objets


d’une classe dérivée
Peut-on faire une affectation entre les deux objets?
Puisque la relation d’héritage est une relation forte, on peut se demander
si l’on peut affecter un objet de la classe de base dans un objet de la classe
dérivée ou pas, et inversement.

ça marche dans un sens et pas dans l’autre


L’idée est que tout objet de la classe dérivée est un objet de la classe de
base et que C++ fait des conversions implicites de type.
On peut mettre un objet de type dérivé vers un type de base mais pas
l’inverse.
Idem : on peut mettre un pointeur sur objet de type dérivé vers un
pointeur sur objet de type de base et pas l’inverse.
Laila AMIR Programmations Orientées Objet
Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Compatibilité entre objets d’une classe de base et objets


d’une classe dérivée

Si B est une classe dérivée de la classe A et si on a :


A a; B b;
alors a = b ; est légal alors que b = a ; est illégal.

Si on a :
A * pa; B * pb;
alors pa = pb ; est légal alors que pb = pa ; est illégal.
Par contre, elle peut être forcée par l’emploi de l’opérateur de cast en
écrivant :
pb = (B*) pa ;

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Compatibilité entre objets d’une classe de base et objets


d’une classe dérivée
Le typage des objets est statique

en C++. Cela signifie que le type d’un objet est connu à la


compilation et ne change plus ensuite.

Point p(3, 5); PointCol pc(8,6,2);


Point * pa = &p; PointCol * pb = &pc;

pa->affiche() appellera Point::affiche();


pb->affiche() appellera PointCol::affiche();

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Compatibilité entre objets d’une classe de base et objets


d’une classe dérivée

Mais si on fait : pa = pb;


malheureusement pa->affiche() appelle Point::affiche().

Le choix de la méthode à appeler est fait statiquement (c’est-à-dire par le


compilateur). On a un typage statique.

Pour que l’on puisse appeler une méthode de l’objet descendant, il faut
que le typage du pointeur soit déterminé à l’exécution. On parle alors de
typage dynamique (qu’on verra plus loin).

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

L’héritage multiple

C++ à la différence du Java, par exemple, accepte l’utilisation de


l’héritage multiple. Cela signifie que l’on peut définir qu’une classe
dérive d’une ou plusieurs classes.
Cette technique offre ainsi la possibilité de factoriser des
attributs et des comportements provenant de plusieurs classes
qui ont peu ou pas de points communs.

Laila AMIR Programmations Orientées Objet


Généralités
L’héritage simple
L’héritage et le polymorphisme en C++ Héritage public, privé et protégé
Compatibilité entre objets de base et objets dérivés
L’héritage multiple

Syntaxe

Pour définir une classe qui dérive de plusieurs classes, il convient de séparer
chaque classe de base par une virgule, comme dans l’exemple suivant :

class C : public A, public B


{
};

La classe C dérive à la fois des classes A et B. Cela signifie que chaque fois
que l’on crée un objet de type C, le C++ créera un objet de type A et un
objet de type B associé à cet objet. Dans ce cas, le constructeur de la
classe C doit appeler les deux constructeurs des classes de base A et B.

Laila AMIR Programmations Orientées Objet


Part III

Partie III: Java

Laila AMIR Programmations Orientées Objet