Académique Documents
Professionnel Documents
Culture Documents
Chapitre 4
Héritage
Constructeurs, destructeurs
Amitié
Fonctions virtuelles
Classes abstraites
2014-2015 2
Notion d’Héritage
Permet de définir une nouvelle classe (classe dérivée) à partir
d’une ou plusieurs classes existantes (classes de base).
2014-2015 3
Notion d’Héritage
L’héritage peut être:
Simple : Une seule classe de base
Multiple: Plusieurs classes de base
véhicule
de course fourgonnette
2014-2015 5
Notion d’Héritage
La classe dérivée est un cas particulier de la classe de base
Si une classe B dérive de la classe A, alors
B va hériter implicitement l’ensemble:
Des attributs de A
Des méthodes de A
2014-2015 6
Syntaxe
Héritage simple
class class_derivee:public class_de_base
{ /* définitions des méthodes et des attributs
spécifiques à la classe dérivée*/ … };
Exemple
class personne {
char nom[20];
char prenom[20];
int CIN;
public:
void saisir(char*,char*,int);
void afficher();
};
class etudiant : public personne {
int CNE;
public:
void saisir_cne(int);
2014-2015 void afficher_cne(); 7
};
Héritage simple
Mode de dérivation
Dérivation public: C’est le mode le plus utilisé
Syntaxe
class B : private A
{ ----
--------
public:
-------
-------- …
};
2014-2015 9
Héritage simple
Droit d’accès aux membres d’une classe
2012-2013 10
Héritage simple
Droit d’accès aux membres de classe
Exemple
class A { void B::fct(int x)
public: {
int pub; pub = x // ok accès possible
pro = x; // ok accès possible
protected : priv = x; //erreur
int pro; //accès non autorisé
}
private :
int priv; void fexterne(A pa, int x)
}; {
pa.pro= x; // erreur
class B : public A { pa.priv= x; // erreur
public: pa.pub = x; // ok
void fct(int x); }
};
2014-2015 11
Héritage simple
Redéfinition de fonctions
Besoin d’adapter certaines fonctions de la classe de base à la
classe dérivée
Redéfinition surdéfinition
Syntaxe
class_derivee::class_derivee(param1,param2,…):base(parami,…)
{------
------
--------
}
Exemple
2014-2015 16
Héritage simple
Constructeur de la classe de base
Exemple 2: Constructeur de la
classe de base avec paramètres
class Point class Point_colore: public Point
{ {int couleur;
protected: public:
int x, y; Point_colore(int, int, int);
Public: void affiche();
Point(int, int); };
void afficher(); Point_colore::Point_colore(int abs,
}; int ord, int cl): Point(abs, ord)
Point:: Point(int abs,int ord) {couleur=cl;
{x=abs; }
Y=ord; void Point_colore:: affiche()
} {
void Point :: affiche() cout<<x<<" " <<y;
{ cout<<"\nCouleur"<<couleur;
cout<<"Cordonnees: "<<x<<y; }
}; 2014-2015 17
Héritage simple
Constructeur de recopie
Deux cas :
La classe dérivée n’a pas de constructeur de
recopie
2014-2015 19
Héritage simple
Constructeur de recopie
Classe dérivée B possède un constructeur de
recopie
Il sera appelé
Pas d’appel automatique du constructeur de
recopie de la classe de base.
Le constructeur de recopie de A doit être
mentionné dans l’entête du constructeur de recopie
de B.
Sinon il y aura appel au constructeur sans
arguments de A (obligatoire).
2014-2015 20
Héritage simple
Constructeur de recopie
Constructeur de recopie défini à la fois
dans la classe de base et la classe dérivée
class Point class Point_colore: public Point
{ protected: {int couleur;
int x, y; Public:
Public: Point_colore(int, int, int);
Point(int, int); Point_colore(Point_colore &);
Point(Point &); //constr de recopie void affiche();
Void afficher(); };
}; Point_colore::Point_colore(int abs,
Point:: Point(int abs, int ord) int ord, int cl): Point(abs, ord)
{x=abs; {couleur=cl;
y=ord; }
} void Point_colore:: affiche()
void Point :: affiche() {
{ Cout<<x<<<" "<<y;
Cout<<"Coordonnees: "<<x<<y; Cout<<"\nCouleur "<<couleur;
}; 2014-2015 } 21
Héritage simple
Constructeur de recopie
Constructeur de recopie défini à la fois
dans la classe de base et la classe dérivée
2014-2015 22
Héritage simple
Constructeur/destructeur
Ordre d’appel
Lors de la déclaration d’un objet de la classe dérivée, le
constructeur de la classe de base est appelé avant celui
de la classe dérivée
2014-2015 23
Héritage simple
Amitié
La déclaration d’amitié pour une classe
accorde aux fonctions de cette classe les
mêmes droits d’accès que ceux des fonctions
membres
2014-2015 25
Fonctions virtuelles
notion de typage
Typage statique:
Le type de l’objet pointé est déterminé au moment
de la compilation
2014-2015 26
Fonctions virtuelles
notion de typage
Typage dynamique:
Le type de l’objet pointé est déterminé lors de l’exécution
et non lors de la compilation
2014-2015 27
Fonctions virtuelles
Faire précéder la fonction en question par le mot clé virtual
Class A Class B: public A
{protected: {……
…… public:
public: void fct();
Virtual void fct(); ….
…. };
};
Le mot virtual est utilisé une seule fois. Il ne doit pas se répéter pour
une même méthode au niveau des classes dérivées.
Un constructeur ne peut pas être virtual, alors que le destructeur peut
l’être.
2014-2015 28
Fonctions virtuelles pures
Fonction déclarée
Comme méthode abstraite
Sans définition dans une classe (pas de code)
Déclarée avec initialisation à zéro
Devant être redéfinie dans les classes dérivées
Syntaxe
virtual type_retour nom_fonc(param)=0;
2014-2015 29
Classes abstraites
Une classe est dite abstraite s’il n’est pas possible de créer des
objets de son type (non instanciable)
Exemple Class A
{protected:
……
public:
Virtual void affiche()=0;
….
2014-2015 }; 30