LA TECHNIQUE DE L’HERITAGE
5. 1 Mise en œuvre
public:
..
}
1
Exemple:
soit point la classe de base:
classe point
{
private:
int x;
int y;
public:
void init(int x,int y)
{
this->x=x;this->y=y;
}
void view()
{
cout <<x<<y;
}
}
p.init(10,20);
p.color(7);
p.view();
p.view_col();
}
ici p est un objet de la classe dérivée pointcol. On peut appeler les méthodes
publics de sa classe (p.color(7) et p.vew_col() ) ainsi que les méthodes publics
de sa classe de base (p.init(10,20) et p.view() ).
3
5.2 Utilisation dans une classe dérivée des membres de la classe de base.
Une classe dérivée n’a pas d’accès aux membres privés de sa classe de base.
Exemple:
class pointcol :public point
{
private:
int couleur;
public:
void view_col()
{
cout << x<<y; // La solution :appeler view() la méthode publique
// de la classe de base qui affiche x et y.
//x et y étant des membres privés de la classe de base point
//donc inaccessible par la classe dérivée.
cout << couleur;
}
}
4
5.3 Redéfinition des fonctions membres
La méthode d’affichage de la classe dérivée aurait pu être appelée view tout comme
celle de la classe de base.
class pointcol :public point
{
private:
int couleur;
public:
void colorer(int couleur)
{
this->couleur=couleur;
}
void view()
{
point::view();
cout << couleur;
}
}
5
Remarque:
Il est possible d’avoir les mêmes noms pour les membres de données.
Exemple:
class A class B:public A
{ {
public : private:
int a; float a;
char c; public:
… void test()
} {
B b;
cout << a; // a de la classe B
cout <<A::a; // a de la classe A
}
}
6
5.4 Appel des constructeurs et destructeurs
Soit la déclaration:
La destruction conduit à:
•Appel au destructeur de B
•Appel au destructeur de A
7
5.5 Transmission d’informations entre constructeurs
Si la classe de base d’un constructeur avec paramètres, la classe dérivée doit avoir
un constructeur et la transmission d’informations de fait comme cet exemple:
class pointcol :public point
{
private:
int couleur;
public:
pointcol(int x, int y, int couleur) : point(x,y)
{
this->couleur=couleur;
}
}
:point(x,y) signifie que le constructeur de pointcol devra transmettre au
constructeur de la classe point , dans l’ordre, x et y.
8
5.6 Constructeur par Recopie
Soit la déclaration
B b2=b1;
Aux mots clés public et private s’ajoute le mot clé protected qui permet de
considérer un membre privé mais accessible à une classe dérivée.
Exemple:
class point
{
protected:
int x;
int y;
public:
…
}
10
5.8 Différentes formes de dérivation
•Dérivation publique
Les membres publics de la classe de base sont accessibles à toutes les fonctions c.a.d:
Aux fonctions membres de la classe dérivée
Aux fonctions membres amies de la classe dérivée
Aux utilisateurs de la classe dérivée.
Les membres privés de la classe de base sont inaccessibles aux fonctions membres
de la classe dérivée , amies, utilisateurs de la classe dérivée.
11
•Dérivation privée
Il est possible d’interdire à un utilisateur d’une classe dérivée l’accès aux membres
publics de sa classe de base.
On utilisera dans ce cas le mot clé private au lieu du mot clé public.
Exemple
Class point classe pointcol :private point
{ {
private: private:
int x; int couleur;
int y; public:
public: void colore(int couleur)
.. {
void deplace(int a,int b) this->couleur=couleur;
{ }
} }
}
main()
{
pointcol p;
p.deplace(3,10); //p est un objet de pointcol qui fait une dérivation privée donc
p.color(7); // impossible pour main (une fonction utilisatrice de pointcol)
// D’accèder aux la fonction membre public deplace()
} 12
•Dérivation protégée
Un objet d’une classe dérivée peut remplacer un objet d’une classe de base, étant donnée
qu’il y a toujours dans l’objet de la classe dérivée les données de la classe de base ainsi que
l’accès aux fonctions membres.
15
5.10 Opérateur d’affectation et héritage
Soit la déclaration
class B:public A
{
}
Soit B p1,p2;
L’affectation p1=p2;
Se déroule membre par membre en considérant que la partie héritée de A constitue un
membre. La partie héritée de A est traitée par l’affectation prévue (s’il y a une surdéfinition de
l’opérateur = il sera appelé.
16
Exemple:
Class point
{
protected :
int x;
int y;
public:
point(int a=0,int b=0) {x=a;y=b;}
point & operator=(point &a)
{
x=a.x;y=a.y;return(*this);
}
}
Class pointcol
{
protected:
int couleur;
public:
pointcol(int a=0,int b=0,int c=1) :point(a,b) {couleur=c;}
pointcol & operator=(point &b)
{
Couleur=b.coluleur; //Ne Suffit pas pour l’affectation
17
}
5.11 HERITAGE MULTIPLE
Une classe peut hériter de 2 classes de base. La classe dérivée va donc hériter des
fonctionnalités des 2 classes de base. Ainsi, on parle dans ce cas d’héritage multiple.
Déclaration :
class <classe derivée> : public <classe de base1>, public <classe base 2>
{
private:
…
public:
..
}
18
Exemple d’illustration
class point class col
{ {
private : private:
int x; int couleur;
int y;
public: public:
point(int x,int y) col(int couleur)
{ {
this->x=x; this->couleur=couleur;
this->y=y; }
}
.. …
} }
}
19
Remarque:
• Constructeur des classes de base, dans l’ordre où les classes de bases sont
déclarées dans la classe dérivée.
• Constructeur de la classe dérivée.
Les destructeurs sont appelés dans l’ordre inverse lors de la destruction d’un objet
de type pointcol (col ensuite point)
Plusieurs fonctions membres peuvent porter le même nom dans différentes classes.
On peut lever l’ambiguité en employant l’opérateur de résolution de portée ::
Exemple
D Hérite 2 fois de A
Les données de A vont apparaitre 2 fois dans D. D
En général, on ne souhaite pas cette duplication des données.
Solution: déclaration virtuelle:
Class B : public virtual A A ne devra introduite qu’une seule fois
Class C : public virtual A au niveau héritage.
Class D :public B,public C
21
5.13 Conflit de nom entre classe de base et classe dérivée lors de l’utilisation
des pointeurs
23
5.14 Polymorphisme
Exemple
class Base
{
public : void main()
virtual int ajouter (int a, int b) {return(a+b);} {
virtual int soustraire(int a, int b) {return(a -b);} Base *p=new Math;
virtual int multiplier (inta, int b) {return(a*b);} cout << p->ajouter(10,20)<<p->soustraire(40,10);
} p->multiplier(10,3);
class Math : public Base p=new Absolue;
{ cout << p-ajouter(15,15<<p->soustraire(10,40);
public: cout <<multiplier(1,30);
virtual int multiplier(int a int b) {cout <<a*b<<‘\n’; return(a*b);] }
}
classe Absolue:public Base
{
public:
virtual int sustraire (int a,int b) { return(abs(a-b));}
}
24
5.15 Méthode virtuelle pure
Une méthode virtuelle pure correspond à un protocole déclaré dans la classe de
base et pour lequel la classe dérivée doit fournir une implémentation.
Dans une classe, une méthode virtuelle pure doit être déclarée comme suit:
25
5.16 Classe Abstraite
26
15.17 Affecter une classe à une autre
Il est possible d’affecter un objet d’une classe à un autre objet d’une autre classe.
Une conversion est dans ce cas nécessaire.
Exemple
void main()
{
point a;
char *s;
s=a;
cout <<s;
}
Dans ce cas il faut définir l’opérateur char *
pour la conversion d’un objet de la classe point. point::operator char *()
{
class point char *p=new char [256];
{ sprintf(p, »X:%d Y:%d »,x,y);
.. return(p);
operator char *(void); }
}
27
28
29
30