chapitre6

Télécharger au format pptx, pdf ou txt
Télécharger au format pptx, pdf ou txt
Vous êtes sur la page 1sur 20

Chapitre5

HERITAGE
Dr, Amira Gharbi
Définitions
Héritage simple
 :La classe dérivée hérite les attributs et les méthodes d’une seule classe mère

Rq: mode: permet d’indiquer la nature de


l’héritage: private, protected ou public. Si aucun
mode n’est indiqué alors l’héritage est privé.
Exemple :

// La classe Pointcolor hérite de la classe Point et ajoute une


variable membre entière couleur et une fonction membre
setcolor qui permet de définir la couleur d'un point.

//on crée un objet de la classe Pointcolor appelé p. On


appelle ensuite la fonction initialise de la classe Point pour
initialiser les coordonnées du point à (10, 20) et la fonction
setcolor de la classe Pointcolor pour définir la couleur du
point à 5. Enfin, on appelle la fonction afficher qui affiche
les coordonnées du point (10, 20).
Utilisation des membres de la
classe de base dans une classe
 L’exempledérivée
précédent, destiné à montrer comment s’exprime l’héritage en C++
 Une première façon d’améliorer cette situation consiste à écrire une nouvelle fonction membre
public :
Et rien n’empêche à une classe dérivée d’accéder à n’importe quel membre public de sa classe de
base. D’ou une définition possible d’ Affichercolor:

D’une manière analogue, nous pouvons définir dans pointcolor une fonction
d’initialisation comme
initialisercolor :
Contrôle d’accès pendant

l'héritage
Dérivation publique :

1-Les membres publics, Les membres protégés,


Et les membres protégés de la classe de base
sont accessibles « à tout le monde », c'est
à la fois aux méthodes, aux fonctions amies de la
classe dérivée ainsi qu'aux utilisateurs de la
classe dérivée.
Contrôle d’accès pendant
l'héritage
 Dérivation privée:

Les membres hérités publics et protégés

d'une classe de base privée deviennent des

membres privés de la classe dérivée.


Contrôle d’accès pendant
l'héritage
 Dérivation protégée:

Les membres hérités publics et protégés

d'une classe de base protégée deviennent

des

membres protégés de la classe dérivée.

Nous retrouvons le même principe que pour

une

dérivation privée,
Héritage multiple

 La classe dérivée hérite les attributs et les méthodes à partir de


plusieurs classes mères
Héritage multiple
Héritage et constructeur
 Si la classe mère contient un constructeur dont l’appel est obligatoire
alors le constructeur de la classe dérivée doit obligatoirement appelé
celui de la classe mère.
 Il faut spécifier le nom et les paramètres du constructeur mère après le
prototype du constructeur fils.
Hiérarchisation des appels
Soit les classes suivantes:

Pour créer un objet de type B, il faut tout d’abord créer un objet de type
A, donc faire appel au constructeur de A, puis le compléter par ce qui est
spécifique à B et faire appel au constructeur de B. Il n’y aura pas à
prévoir dans le constructeur de B l’appel du constructeur de A.

La même application s’applique aux destructeur : lors de la destruction


d’un objet de type B, il y aura automatiquement appel du destructeur de
B, puis appel de celui de A (les destructeurs sont appelés dans l’ordre
inverse de l’appel des destructeurs).
#include <iostream>
#include <string>
using namespace std;
class Point {
private:
int x;
int y;

public:
// Constructeur de la classe de base Point
Point(int abs, int ord) : x(abs), y(ord) {
cout << "Constructeur de Point : (" << x << ", " << y << ")" << endl;
}

// Destructeur de la classe de base Point


~Point() {
cout << "Destructeur de Point" << endl;
}

// Méthode qui affiche les coordonnées


void afficher() const {
cout << "Point : (" << x << ", " << y << ")" << endl;
}
};
class PointColor : public Point
{
private:
string couleur;

public:
// Constructeur de la classe dérivée PointColor
PointColor(int abs, int ord, const string& color):
Point(abs, ord), couleur(color) {// Appel du constructeur de Point
cout << "Constructeur de PointColor : " << couleur << endl;
}
// Destructeur de la classe dérivée PointColor
~PointColor() {
cout << "Destructeur de PointColor" << endl;
}

// Methode pour afficher les informations du PointColor


void afficher() const {
Point::afficher(); // Appel de la méthode de la classe de base
cout << "Couleur : " << couleur << endl;
}
};
int main() {
// Création d'un objet de la classe dérivée
PointColor
PointColor point1(3, 4, "Rouge");

// Affichage des informations


point1.afficher();

// Objet sera détruit à la fin du bloc main


return 0;
}

Cela montre que les constructeurs et destructeurs sont exécutés dans le


bon ordre.
Compatibilité entre classe de
base et classe dérivée

 Dans le cadre de l'héritage, il sera possible de


passer d'une classe dérivée vers une classe de
base. Par contre l'inverse ne sera pas possible
class Forme
{ int x; 1- La première fonction est le constructeur de
int y; la classe "Forme" qui prend deux entiers en
paramètres (x et y) et initialise les variables
public: //1 de la classe "x" et "y" avec ces valeurs à l'aide
Forme(int x, int y) du mot-clé "this". Cela permet de différencier
entre le paramètre passé à la fonction et la
{ this->x=x ; variable membre de la classe.
this->y=y ;}
1-une méthode de la classe "Forme"
void deplacer(int dx, int dy) appelée "deplacer" qui prend deux entiers
{ x+=dx; en paramètres (dx et dy) et déplace la
y+=dy ; } forme en ajoutant ces valeurs aux variables
}; membres "x" et "y".
class Cercle: public Forme
{ int rayon; 2-La classe Cercle a un constructeur
qui initialise les attributs x, y et
public: rayon en utilisant le constructeur de
la classe Forme, et une méthode
Cercle(int x, int y, int r):Forme(x, y)//2 agrandir qui augmente le rayon du
{ rayon=r ; } cercle.
void agrandir(int a)
{ rayon+=a; }
};
void main()
3- Création de l'objet f1de la classe Forme avec les
{ Forme f1(2,3); //3
coordonnées (2,3)
Cercle c1(15, -1, 50) ; //4
4- Création de l'objet c1avec les coordonnées (15,-1) et un
rayon de 50
c1.deplacer(3, 4) ; //5
5- Possibilité de déplacer le cercle c1 puisque la méthode a
c1.agrandir(10) ; //6
été
7- héritéeet à gauche de l'opérateur d'affectation, les types
A droite
f1=c1 ; //7 sont différents. C'est toujours le type qui est à droite qui est
6- on agrandit
transformé verslelecercle c1 gauche.
type de de 10 avec
Ici,la
leméthode
cercle c1agrandir.
est aussi
f1.deplacer(5, -8) ; //8 une forme, donc la conversion implicite est lancée. Cette
} démarche paraît normale puisqu'à l'issue de cette opération,
les attributs de l'objet f1 sont parfaitement définis.

8- On déplace ensuite la forme f1 de (5,-8).


1- La première fonction est le constructeur de la classe "Forme" qui prend
deux entiers en paramètres (x et y) et initialise les variables de la classe "x"
et "y" avec ces valeurs à l'aide du mot-clé "this". Cela permet de différencier
entre le paramètre passé à la fonction et la variable membre de la classe.

-une méthode de la classe "Forme" appelée "deplacer" qui prend deux entiers
en paramètres (dx et dy) et déplace la forme en ajoutant ces valeurs aux
variables membres "x" et "y".

2- La classe Cercle a un constructeur qui initialise les attributs x, y et rayon en


utilisant le constructeur de la classe Forme, et une méthode agrandir qui
augmente le rayon du cercle.
3- Création de l'objet f1de la classe Forme avec les coordonnées (2,3)
4- Création de l'objet c1avec les coordonnées (15,-1) et un rayon de 50.
5- Possibilité de déplacer le cercle c1 puisque la méthode a été héritée.
6- on agrandit le cercle c1 de 10 avec la méthode agrandir.
7- A droite et à gauche de l'opérateur d'affectation, les types sont
différents. C'est
toujours le type qui est à droite qui est transformé vers le type de
gauche. Ici, le
cercle c1 est aussi une forme, donc la conversion implicite est lancée.
Cette
démarche paraît normale puisqu'à l'issue de cette opération, les
attributs de l'objet
f1 sont parfaitement définis.

8- On déplace ensuite la forme f1 de (5,-8).

Vous aimerez peut-être aussi