SlideShare une entreprise Scribd logo
1  sur  8
Télécharger pour lire hors ligne
L’héritage en C++
Philippe d’Anfray GIP RENATER
2006-2007
Philippe.d-Anfray@renater.fr
Formation d’Ing´enieurs de l’Institut Galil´ee MACS 2
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 1/30
Héritage/Définition (1)
On peut dériver une classe à partir d’une autre. La classe dérivée
hérite de toutes les caractéristiques de la classe dite de base.
class BASE class DERIVEE : PUBLIC BASE
{ {
int i, j; int k, l;
... ...
public: public:
void f_base (...); void f_derivee (...);
... ...
}; };
...
On intéressera essentiellement à l’héritage “public”.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 2/30
Héritage/Définition (2)
Une instance de la classe dérivée possède en plus des siens toutes
les données et toutes les méthodes de la classe de base.
...
int main()
{
DERIVEE d1, d2;
d1.f_base (...); // Possible, vient de BASE
d1.f_derivee (..); // OK aussi vient de DERIVE
}
On peut redéfinir le comportement de l’objet en surchargeant les
méthodes
Attention. . . voir plus loin. . .
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 3/30
Héritage/Définition (3)
Le processus peut se répéter, on obtient des graphes d’héritage
Héritage simple: un arbre,
Héritage multiple: graphe acyclique.
Base
Dérivé_2Dérivé_1
Dérivé_3 Dérivé_4
Dérivé_2Dérivé_1 Dérivé_3
Dérivé_4
Base_1 Base_2
Arbre d’héritage (simple) Graphe d’héritage (multiple)
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 4/30
Privé/Public (1)
Rappel: lors de la définition des objets, il y a toujours deux points de
vues et donc deux statuts possibles pour les champs:
le programmeur concepteur/développeur, partie “privée”;
le programmeur utilisateur, partie “public”.
Comment ces notions passent-elles à travers les mécanismes
d’héritage ?
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 5/30
Privé/Public (2)
Règle générale:
La partie privée de la classe de base reste inaccessible à la
classe dérivée.
Le concepteur de DERIVEE n’a pas accès à la partie privée de
la classe de BASE sauf si elle est déclarée explicitement amie.
Tout ce qui peut modifier la partie privée d’une classe doit être
déclaré dans le corps de la classe.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 6/30
Privé/Public (3)
Cas de l’héritage “privé”, la partie publique de BASE devient privée
pour DERIVEE. Le concepteur de DERIVEE y a accès pas
l’utilisateur.
class BASE class DERIVEE:BASE
{ {
private://dev. BASE private:// dev. DERIVEE
... ...
public: //util. BASE public: // util. DERIVEE
... //dev. DERIVEE ...
}; };
Mais on s’intéresse plutôt à l’héritage “public”
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 7/30
Privé/Public (4)
La partie publique de BASE peut être rendus accessible aux
utilisateurs de DERIVEE: héritage “public”.
class BASE class DERIVEE:public BASE
{ {
private://dev. BASE private:// dev. DERIVEE
... ...
public: //util. BASE public: // util. DERIVEE
... //dev. DERIVEE ...
... //util. DERIVEE };
... //car public
};
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 8/30
Privé/Public (5)
Pour des raisons d’optimisations, le concepteur de DERIVEE a
souvent besoin d’ accèder à la partie privée de BASE.
Cela donne lieu à deux types d’excès:
le tout ami: plus aucune protection;
le tout public: visibilité totale.
Problème: on perd la séparation spécification/réalisation !
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 9/30
Protégé (1)
Il existe un statut intermédiaire: le champ protégé:
class BASE class DERIVEE: public BASE
{ private: //dev. BASE {
... private:
protected://dev. BASE ...
... //dev. DERIVEE public:
public: //util. BASE ...
... //dev. DERIVEE };
};
Un champ protégé de BASE est accessible aux développeurs de
DERIVEE pas aux utilisateurs.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 10/30
Héritage / Fonctions amies (1)
Les relations d’amitié ne se transmettent pas par héritage.
class BASE class DERIVEE: public BASE
{ {
private: ... private:
protected: ... ...
public: public:
friend void ff ...
(BASE& b...); ...
... };
};
ff n’est pas amie de DERIVEE.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 11/30
Héritage/ Constructeurs-Destructeurs (1)
Deux règles simples:
Le constructeur de la classe de base si il existe est appelé avant
le constructeur de la classe dérivée.
Le destructeur de la classe de base si il existe est appelé après
le destructeur de la classe dérivée.
Se généralise si il y a plusieurs dérivations.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 12/30
Héritage/ Constructeurs-Destructeurs (2)
Un problème, celui des arguments:
class BASE class DERIVEE : public BASE
{ ... { ...
public: public:
// avec arguments // avec arguments
BASE DERIVEE
(int b_1...float b_n) (float d_1...char* d_m);
{... ...
} };
};
Je dois pouvoir utiliser DERIVEE sans a priori connaître BASE.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 13/30
Héritage/ Constructeurs-Destructeurs (3)
Quand je réalise le constructeur de DERIVEE je dois donner les
valeurs des arguments du constructeur de BASE:
DERIVEE::DERIVEE (float d_1, ...char* d_m)
:BASE (val_b_1...val_b_n);
//
// val_b_1...val_b_n sont les valeurs
// des arguments b_1...b_n passes au
// constructeur de la classe BASE
// pour construire un objet DERIVEE
{
... ;
}
Les destructeurs n’ont pas d’argument, pas de problème(s).
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 14/30
Polymorphisme (1)
Je peux redéfinir une fonction:
class BASE class DER:public BASE int main()
{ { {
... ... DER d;
public: public: // ff de DER
void ff(..); void ff (..); d.ff(..);
... ... // ff de BASE
}; }; d.BASE::ff(..);
}
Notez le come-back de l’opérateur ::
Les redéfinitions de fonctions sont dangereuses à manipuler...
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 15/30
Polymorphisme (2)
Un pointeur sur une instance d’une classe dérivée peut être
considéré comme un pointeur sur une instance de la classe de base.
Dans l’autre sens le typage explicite est obligatoire .
main()
{
BASE *p_base;
DERIVEE *p_derivee;
...
// licite du particulier au general
p_base = p_derivee;
// du general au particulier: requete explicite
p_derivee = (DERIVEE *) p_base;
...
}
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 16/30
Fonctions virtuelles (1)
Soit une classe matrice_carree. Je sais définir les méthodes mais
la forme des données n’est pas fixée à priori:
Matrice
Symétrique
Carrée
Matrice Matrice tridiagonale ...
.........
Matrice Pleine
On aura une réalisation différente pour chaque classe dérivée.
notion d’archétype.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 17/30
Fonctions virtuelles (2)
Fonction virtuelles:
class matrice_carree
{
// donnees: pas les elements
public:
virtual inverser(..);
...
}
Ceci signifie que je vais (éventuellement) redéfinir la méthode
inverser dans les classes dérivées.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 18/30
Fonctions virtuelles (3)
class matrice_symetrique: public matrice_carree
{
// donnes privees
public: ...
virtual inverser (...);
};
class matrice_tridiagonale: public matrice_carree
{
// donnees privees
public: ...
virtual inverser (...);
};
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 19/30
Fonctions virtuelles (4)
Fonction virtuelle, plus que la simple surcharge: mécanisme de la
liaison dynamique.
Une application peut utiliser matrice_carree sans connaître a
priori les types qui seront dérivés:
void f_appli (matrice_carree& m, ...)
{
...
m.inverser (); // on travaille sur le
... // type matrice_carree
}
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 20/30
Fonctions virtuelles (5)
On ira chercher à l’exécution la réalisation de inverser
correspondant au type réel de l’instance (celui de la déclaration).
int main()
{
matrice_tridiagonale mt;
// ici on utilisera pour "inverser" dans ‘‘f_appli’’
// la realisation de la classe derivee tridiagonale
f_appli (mt, ..);
...
}
Si une fonction doit être redéfinie, utiliser une fonction virtuelle.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 21/30
Fonctions virtuelles (6)
On ira chercher à l’exécution la réalisation de la méthode
correspondant au type réel de l’instance (celui de la déclaration).
C’est pour cette raison que le destructeur doit être virtuel.
N.B. le constructeur ne peut être virtuel.
Attention en cas de “simple surcharge” le choix sera fait à la
compilation.
Problème: l’éventuel surcoût du mécanisme (compilateurs
“dévirtualiseurs”).
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 22/30
Classe abstraite (1)
Une fonction virtuelle pure ne reçoit aucune réalisation par défaut.
Une classe qui contient au moins une fonction virtuelle pure est une
classe abstraite.
class ABSTRAITE //Notion d’archetype
{
...
public:
virtual void info(..)=0;//virtuelle pure
};
Il n’est pas possible d’instancier un objet de type ABSTRAITE.
Il faut écrire des classes dérivées de ABSTRAITE.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 23/30
Héritage multiple/ambiguités (1)
Toutes les ambiguités d’accès doivent être levées à la compilation:
class B_1 class B_2 class D: int main()
{... {... public B_1, {
public: public: public B_2 D vd;
int i,ii; int* ii; { vd.i ..//OK de B_1
... ... ... vd.B_1::ii//de B_1
}; }; }; vd.B_2::ii//de B_2
}
Encore une fois, :: précise le référentiel.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 24/30
Héritage multiple/duplication (1)
Le graphe d’héritage peut amener la duplication d’une classe de
base:
liste_chaînée
liste_de_A liste_de_B
dérivé_A_B
matrice_carree
matrice_symétrique_définie_positive
matrice_symétrique matrice_définie_positive
Duplication souhaitable Duplication non souhaitable
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 25/30
Héritage multiple/duplication (2)
Si on ne fait rien ==> duplication
class GP class D1 class U: int main()
{... :public GP public D1, {
public: {... public D2 U u1;
int i; }; { //GP via D1
... ... u1.D1::i ...
}; class D2 }; //GP via D2
public GP u1.D2::i ...
{... }
}; }
L’utilisation de l’opérateur :: est obligatoire pour préciser le
référentiel.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 26/30
Héritage multiple/duplication (3)
Pour éviter la duplication: notion de “classe virtuelle”.
class GP class D1: class U: int main()
{... public virtual GP public D1, {
public: {... public D2 U u1;
int i; }; { u1.i ..
... class D2: ... //un seul i
}; public virtual G }; //(de GP)
{... };
};
Problème: l’héritage virtual n’est ni une propriété de GP, ni une
spécification de U.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 27/30
Récapitulation-2 (1)
Notions à bien comprendre:
Héritage simple, multiple.
privé/public/protégé.
Fonctions virtuelles.
Classes abstraites.
Classes virtuelles.
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 28/30
C++/Conclusions (1)
La généricité est utile pour des logiciels de grande taille et dans
l’optique réutilisation:
les types paramètres (template);
l’héritage simple;
l’héritage multiple (difficile à gérer).
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 29/30
C++/Conclusions (2)
Le langage C++
offre beaucoup de possibilités.
mais. . . il est aussi très “permissif”.
Il est indispensable d’avoir une méthodologie:
faire le “tri” (quelle caractéristique est utile à un moment
donné).
suivre une démarche de réalisation (les types, leurs
relations mutuelles).
GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 30/30

Contenu connexe

Tendances

C++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistC++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistVincent Agnus
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simplesPethrvs
 
Partie 13: Héritage Multiple — Programmation orientée objet en C++
Partie 13: Héritage Multiple — Programmation orientée objet en C++Partie 13: Héritage Multiple — Programmation orientée objet en C++
Partie 13: Héritage Multiple — Programmation orientée objet en C++Fabio Hernandez
 
Polymorphisme : un concept polymorphe !
Polymorphisme : un concept polymorphe !Polymorphisme : un concept polymorphe !
Polymorphisme : un concept polymorphe !Aurélien Regat-Barrel
 
Partie 11: Héritage — Programmation orientée objet en C++
Partie 11: Héritage — Programmation orientée objet en C++Partie 11: Héritage — Programmation orientée objet en C++
Partie 11: Héritage — Programmation orientée objet en C++Fabio Hernandez
 
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++Partie 5: Mémoire Dynamique — Programmation orientée objet en C++
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++Fabio Hernandez
 
Partie 8: Objets et Classes — Programmation orientée objet en C++
Partie 8: Objets et Classes — Programmation orientée objet en C++Partie 8: Objets et Classes — Programmation orientée objet en C++
Partie 8: Objets et Classes — Programmation orientée objet en C++Fabio Hernandez
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeAmir Souissi
 
Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfacesAmir Souissi
 
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Fabio Hernandez
 
Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5Laurent BUNIET
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objetsAziz Darouichi
 
Partie 12: Polymorphisme — Programmation orientée objet en C++
Partie 12: Polymorphisme — Programmation orientée objet en C++Partie 12: Polymorphisme — Programmation orientée objet en C++
Partie 12: Polymorphisme — Programmation orientée objet en C++Fabio Hernandez
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07haythem_2015
 
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++Microsoft
 
C++ 11 - Tech Days 2014 in Paris
C++ 11 - Tech Days 2014 in ParisC++ 11 - Tech Days 2014 in Paris
C++ 11 - Tech Days 2014 in Parischristophep21
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Aurélien Regat-Barrel
 

Tendances (20)

C++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistC++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelist
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Trivial Java - Part 2
Trivial Java - Part 2Trivial Java - Part 2
Trivial Java - Part 2
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simples
 
Partie 13: Héritage Multiple — Programmation orientée objet en C++
Partie 13: Héritage Multiple — Programmation orientée objet en C++Partie 13: Héritage Multiple — Programmation orientée objet en C++
Partie 13: Héritage Multiple — Programmation orientée objet en C++
 
Polymorphisme : un concept polymorphe !
Polymorphisme : un concept polymorphe !Polymorphisme : un concept polymorphe !
Polymorphisme : un concept polymorphe !
 
Partie 11: Héritage — Programmation orientée objet en C++
Partie 11: Héritage — Programmation orientée objet en C++Partie 11: Héritage — Programmation orientée objet en C++
Partie 11: Héritage — Programmation orientée objet en C++
 
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++Partie 5: Mémoire Dynamique — Programmation orientée objet en C++
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++
 
Partie 8: Objets et Classes — Programmation orientée objet en C++
Partie 8: Objets et Classes — Programmation orientée objet en C++Partie 8: Objets et Classes — Programmation orientée objet en C++
Partie 8: Objets et Classes — Programmation orientée objet en C++
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphisme
 
Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfaces
 
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
 
Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
Partie 12: Polymorphisme — Programmation orientée objet en C++
Partie 12: Polymorphisme — Programmation orientée objet en C++Partie 12: Polymorphisme — Programmation orientée objet en C++
Partie 12: Polymorphisme — Programmation orientée objet en C++
 
Trivial Java - Part 1
Trivial Java - Part 1Trivial Java - Part 1
Trivial Java - Part 1
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07
 
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
 
C++ 11 - Tech Days 2014 in Paris
C++ 11 - Tech Days 2014 in ParisC++ 11 - Tech Days 2014 in Paris
C++ 11 - Tech Days 2014 in Paris
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14
 

En vedette

Panorama Top 250 des éditeurs et créateurs de logiciels français
Panorama Top 250 des éditeurs et créateurs de logiciels françaisPanorama Top 250 des éditeurs et créateurs de logiciels français
Panorama Top 250 des éditeurs et créateurs de logiciels françaisEY
 
ShareLex & l'économie collaborative - Collège des Bernardins 13 juin 2014
ShareLex & l'économie collaborative - Collège des Bernardins 13 juin 2014ShareLex & l'économie collaborative - Collège des Bernardins 13 juin 2014
ShareLex & l'économie collaborative - Collège des Bernardins 13 juin 2014Anne-Laure Brun-Buisson
 
New york odp
New york odpNew york odp
New york odpnacarEOI
 
Student challenge 2013 - encore merci
Student challenge 2013  - encore merciStudent challenge 2013  - encore merci
Student challenge 2013 - encore merci4Leeway
 
Ajouter du son sur prezi
Ajouter du son sur preziAjouter du son sur prezi
Ajouter du son sur prezifrancoisebreton
 
Dossier invitation-indoor-st-etienne-2013
Dossier invitation-indoor-st-etienne-2013Dossier invitation-indoor-st-etienne-2013
Dossier invitation-indoor-st-etienne-2013John Moko-Hèlp
 
Observatoire des transports_franco_italiens_nice_12_avril_13
Observatoire des transports_franco_italiens_nice_12_avril_13Observatoire des transports_franco_italiens_nice_12_avril_13
Observatoire des transports_franco_italiens_nice_12_avril_13INTERALPES Alcotra 2007-2013
 
3 m. julien robert citizenside - le mobile au service de l'actualité
3 m. julien robert   citizenside - le mobile au service de l'actualité3 m. julien robert   citizenside - le mobile au service de l'actualité
3 m. julien robert citizenside - le mobile au service de l'actualitéOrangeDeveloperCenter
 

En vedette (20)

6-Cm9 14-15
6-Cm9 14-156-Cm9 14-15
6-Cm9 14-15
 
Panorama Top 250 des éditeurs et créateurs de logiciels français
Panorama Top 250 des éditeurs et créateurs de logiciels françaisPanorama Top 250 des éditeurs et créateurs de logiciels français
Panorama Top 250 des éditeurs et créateurs de logiciels français
 
Congo
CongoCongo
Congo
 
5-Cm19 11-12
5-Cm19 11-125-Cm19 11-12
5-Cm19 11-12
 
4-Cm2 14-15
4-Cm2 14-154-Cm2 14-15
4-Cm2 14-15
 
Atencion Primaria en Salud (Atlantico)
Atencion Primaria en Salud (Atlantico)Atencion Primaria en Salud (Atlantico)
Atencion Primaria en Salud (Atlantico)
 
5-Cm11 pourcentage
5-Cm11 pourcentage5-Cm11 pourcentage
5-Cm11 pourcentage
 
ShareLex & l'économie collaborative - Collège des Bernardins 13 juin 2014
ShareLex & l'économie collaborative - Collège des Bernardins 13 juin 2014ShareLex & l'économie collaborative - Collège des Bernardins 13 juin 2014
ShareLex & l'économie collaborative - Collège des Bernardins 13 juin 2014
 
3-Cm6-2013-2014
3-Cm6-2013-20143-Cm6-2013-2014
3-Cm6-2013-2014
 
New york odp
New york odpNew york odp
New york odp
 
Student challenge 2013 - encore merci
Student challenge 2013  - encore merciStudent challenge 2013  - encore merci
Student challenge 2013 - encore merci
 
4-Cm9 14-15
4-Cm9 14-154-Cm9 14-15
4-Cm9 14-15
 
Ajouter du son sur prezi
Ajouter du son sur preziAjouter du son sur prezi
Ajouter du son sur prezi
 
Bilan des #ET10
Bilan des #ET10Bilan des #ET10
Bilan des #ET10
 
4-Cm1 10-11
4-Cm1 10-114-Cm1 10-11
4-Cm1 10-11
 
Dossier invitation-indoor-st-etienne-2013
Dossier invitation-indoor-st-etienne-2013Dossier invitation-indoor-st-etienne-2013
Dossier invitation-indoor-st-etienne-2013
 
#ET11 - A2-Conduite de projet
#ET11 - A2-Conduite de projet#ET11 - A2-Conduite de projet
#ET11 - A2-Conduite de projet
 
Observatoire des transports_franco_italiens_nice_12_avril_13
Observatoire des transports_franco_italiens_nice_12_avril_13Observatoire des transports_franco_italiens_nice_12_avril_13
Observatoire des transports_franco_italiens_nice_12_avril_13
 
Revue de presse 1213
Revue de presse 1213Revue de presse 1213
Revue de presse 1213
 
3 m. julien robert citizenside - le mobile au service de l'actualité
3 m. julien robert   citizenside - le mobile au service de l'actualité3 m. julien robert   citizenside - le mobile au service de l'actualité
3 m. julien robert citizenside - le mobile au service de l'actualité
 

Similaire à 2006 2007-heritage-en-c++

Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfslimyaich3
 
chapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdfchapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdfMoez Moezm
 
Héritage dans cpp dev informatique ingenierie
Héritage dans cpp dev informatique ingenierieHéritage dans cpp dev informatique ingenierie
Héritage dans cpp dev informatique ingenierieMohammedAmineELHARCH1
 
Heritage+polymorphisme.pdf
Heritage+polymorphisme.pdfHeritage+polymorphisme.pdf
Heritage+polymorphisme.pdfWissalRAHAOUI3
 
Trivial java First
Trivial java FirstTrivial java First
Trivial java FirstKatia Aresti
 
Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdframadanmahdi
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzlesMicrosoft
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Engineor
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 

Similaire à 2006 2007-heritage-en-c++ (20)

Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
 
Qc mcorrige
Qc mcorrigeQc mcorrige
Qc mcorrige
 
POO
POOPOO
POO
 
chapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdfchapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdf
 
POO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdfPOO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdf
 
Héritage dans cpp dev informatique ingenierie
Héritage dans cpp dev informatique ingenierieHéritage dans cpp dev informatique ingenierie
Héritage dans cpp dev informatique ingenierie
 
POO-chapitre3.pptx
POO-chapitre3.pptxPOO-chapitre3.pptx
POO-chapitre3.pptx
 
Heritage+polymorphisme.pdf
Heritage+polymorphisme.pdfHeritage+polymorphisme.pdf
Heritage+polymorphisme.pdf
 
cours1.ppt
cours1.pptcours1.ppt
cours1.ppt
 
cours1.ppt
cours1.pptcours1.ppt
cours1.ppt
 
cours2.ppt
cours2.pptcours2.ppt
cours2.ppt
 
Cours5-heritage.pptx
Cours5-heritage.pptxCours5-heritage.pptx
Cours5-heritage.pptx
 
Trivial java First
Trivial java FirstTrivial java First
Trivial java First
 
Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdf
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
Examen 2011 exo 4
Examen 2011 exo 4Examen 2011 exo 4
Examen 2011 exo 4
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !
 
Cours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweightCours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweight
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 

Dernier

A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.Franck Apolis
 
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptxSAID MASHATE
 
Cours-irrigation_et_drainage_cours1.pptx
Cours-irrigation_et_drainage_cours1.pptxCours-irrigation_et_drainage_cours1.pptx
Cours-irrigation_et_drainage_cours1.pptxlamourfrantz
 
systeme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expertsysteme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expertChristianMbip
 
MaintenanceLa Maintenance Corrective.ppt
MaintenanceLa Maintenance Corrective.pptMaintenanceLa Maintenance Corrective.ppt
MaintenanceLa Maintenance Corrective.pptssusercbaa22
 
Guide Final de rédaction de mémoire de fin d'étude
Guide Final de rédaction de mémoire de fin d'étudeGuide Final de rédaction de mémoire de fin d'étude
Guide Final de rédaction de mémoire de fin d'étudeBenamraneMarwa
 
Bolero. pptx . Film de A nnne Fontaine
Bolero. pptx . Film   de  A nnne FontaineBolero. pptx . Film   de  A nnne Fontaine
Bolero. pptx . Film de A nnne FontaineTxaruka
 
presentation l'interactionnisme symbolique finale.pptx
presentation l'interactionnisme symbolique  finale.pptxpresentation l'interactionnisme symbolique  finale.pptx
presentation l'interactionnisme symbolique finale.pptxMalikaIdseaid1
 
Formation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipFormation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipM2i Formation
 
Approche-des-risques-par-l’analyse-des-accidents-1.pptx
Approche-des-risques-par-l’analyse-des-accidents-1.pptxApproche-des-risques-par-l’analyse-des-accidents-1.pptx
Approche-des-risques-par-l’analyse-des-accidents-1.pptxssusercbaa22
 
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...Faga1939
 
Fondation Louis Vuitton. pptx
Fondation      Louis      Vuitton.   pptxFondation      Louis      Vuitton.   pptx
Fondation Louis Vuitton. pptxTxaruka
 
Présentation de cartes d'extension zhr..pptx
Présentation de cartes d'extension zhr..pptxPrésentation de cartes d'extension zhr..pptx
Présentation de cartes d'extension zhr..pptxpopzair
 

Dernier (15)

A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.
 
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
 
Cours-irrigation_et_drainage_cours1.pptx
Cours-irrigation_et_drainage_cours1.pptxCours-irrigation_et_drainage_cours1.pptx
Cours-irrigation_et_drainage_cours1.pptx
 
systeme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expertsysteme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expert
 
MaintenanceLa Maintenance Corrective.ppt
MaintenanceLa Maintenance Corrective.pptMaintenanceLa Maintenance Corrective.ppt
MaintenanceLa Maintenance Corrective.ppt
 
Guide Final de rédaction de mémoire de fin d'étude
Guide Final de rédaction de mémoire de fin d'étudeGuide Final de rédaction de mémoire de fin d'étude
Guide Final de rédaction de mémoire de fin d'étude
 
Pâques de Sainte Marie-Euphrasie Pelletier
Pâques de Sainte Marie-Euphrasie PelletierPâques de Sainte Marie-Euphrasie Pelletier
Pâques de Sainte Marie-Euphrasie Pelletier
 
Bolero. pptx . Film de A nnne Fontaine
Bolero. pptx . Film   de  A nnne FontaineBolero. pptx . Film   de  A nnne Fontaine
Bolero. pptx . Film de A nnne Fontaine
 
presentation l'interactionnisme symbolique finale.pptx
presentation l'interactionnisme symbolique  finale.pptxpresentation l'interactionnisme symbolique  finale.pptx
presentation l'interactionnisme symbolique finale.pptx
 
Formation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipFormation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadership
 
Approche-des-risques-par-l’analyse-des-accidents-1.pptx
Approche-des-risques-par-l’analyse-des-accidents-1.pptxApproche-des-risques-par-l’analyse-des-accidents-1.pptx
Approche-des-risques-par-l’analyse-des-accidents-1.pptx
 
Evaluación Alumnos de Ecole Victor Hugo
Evaluación Alumnos de Ecole  Victor HugoEvaluación Alumnos de Ecole  Victor Hugo
Evaluación Alumnos de Ecole Victor Hugo
 
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
 
Fondation Louis Vuitton. pptx
Fondation      Louis      Vuitton.   pptxFondation      Louis      Vuitton.   pptx
Fondation Louis Vuitton. pptx
 
Présentation de cartes d'extension zhr..pptx
Présentation de cartes d'extension zhr..pptxPrésentation de cartes d'extension zhr..pptx
Présentation de cartes d'extension zhr..pptx
 

2006 2007-heritage-en-c++

  • 1. L’héritage en C++ Philippe d’Anfray GIP RENATER 2006-2007 Philippe.d-Anfray@renater.fr Formation d’Ing´enieurs de l’Institut Galil´ee MACS 2 GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 1/30 Héritage/Définition (1) On peut dériver une classe à partir d’une autre. La classe dérivée hérite de toutes les caractéristiques de la classe dite de base. class BASE class DERIVEE : PUBLIC BASE { { int i, j; int k, l; ... ... public: public: void f_base (...); void f_derivee (...); ... ... }; }; ... On intéressera essentiellement à l’héritage “public”. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 2/30 Héritage/Définition (2) Une instance de la classe dérivée possède en plus des siens toutes les données et toutes les méthodes de la classe de base. ... int main() { DERIVEE d1, d2; d1.f_base (...); // Possible, vient de BASE d1.f_derivee (..); // OK aussi vient de DERIVE } On peut redéfinir le comportement de l’objet en surchargeant les méthodes Attention. . . voir plus loin. . . GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 3/30 Héritage/Définition (3) Le processus peut se répéter, on obtient des graphes d’héritage Héritage simple: un arbre, Héritage multiple: graphe acyclique. Base Dérivé_2Dérivé_1 Dérivé_3 Dérivé_4 Dérivé_2Dérivé_1 Dérivé_3 Dérivé_4 Base_1 Base_2 Arbre d’héritage (simple) Graphe d’héritage (multiple) GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 4/30
  • 2. Privé/Public (1) Rappel: lors de la définition des objets, il y a toujours deux points de vues et donc deux statuts possibles pour les champs: le programmeur concepteur/développeur, partie “privée”; le programmeur utilisateur, partie “public”. Comment ces notions passent-elles à travers les mécanismes d’héritage ? GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 5/30 Privé/Public (2) Règle générale: La partie privée de la classe de base reste inaccessible à la classe dérivée. Le concepteur de DERIVEE n’a pas accès à la partie privée de la classe de BASE sauf si elle est déclarée explicitement amie. Tout ce qui peut modifier la partie privée d’une classe doit être déclaré dans le corps de la classe. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 6/30 Privé/Public (3) Cas de l’héritage “privé”, la partie publique de BASE devient privée pour DERIVEE. Le concepteur de DERIVEE y a accès pas l’utilisateur. class BASE class DERIVEE:BASE { { private://dev. BASE private:// dev. DERIVEE ... ... public: //util. BASE public: // util. DERIVEE ... //dev. DERIVEE ... }; }; Mais on s’intéresse plutôt à l’héritage “public” GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 7/30 Privé/Public (4) La partie publique de BASE peut être rendus accessible aux utilisateurs de DERIVEE: héritage “public”. class BASE class DERIVEE:public BASE { { private://dev. BASE private:// dev. DERIVEE ... ... public: //util. BASE public: // util. DERIVEE ... //dev. DERIVEE ... ... //util. DERIVEE }; ... //car public }; GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 8/30
  • 3. Privé/Public (5) Pour des raisons d’optimisations, le concepteur de DERIVEE a souvent besoin d’ accèder à la partie privée de BASE. Cela donne lieu à deux types d’excès: le tout ami: plus aucune protection; le tout public: visibilité totale. Problème: on perd la séparation spécification/réalisation ! GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 9/30 Protégé (1) Il existe un statut intermédiaire: le champ protégé: class BASE class DERIVEE: public BASE { private: //dev. BASE { ... private: protected://dev. BASE ... ... //dev. DERIVEE public: public: //util. BASE ... ... //dev. DERIVEE }; }; Un champ protégé de BASE est accessible aux développeurs de DERIVEE pas aux utilisateurs. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 10/30 Héritage / Fonctions amies (1) Les relations d’amitié ne se transmettent pas par héritage. class BASE class DERIVEE: public BASE { { private: ... private: protected: ... ... public: public: friend void ff ... (BASE& b...); ... ... }; }; ff n’est pas amie de DERIVEE. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 11/30 Héritage/ Constructeurs-Destructeurs (1) Deux règles simples: Le constructeur de la classe de base si il existe est appelé avant le constructeur de la classe dérivée. Le destructeur de la classe de base si il existe est appelé après le destructeur de la classe dérivée. Se généralise si il y a plusieurs dérivations. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 12/30
  • 4. Héritage/ Constructeurs-Destructeurs (2) Un problème, celui des arguments: class BASE class DERIVEE : public BASE { ... { ... public: public: // avec arguments // avec arguments BASE DERIVEE (int b_1...float b_n) (float d_1...char* d_m); {... ... } }; }; Je dois pouvoir utiliser DERIVEE sans a priori connaître BASE. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 13/30 Héritage/ Constructeurs-Destructeurs (3) Quand je réalise le constructeur de DERIVEE je dois donner les valeurs des arguments du constructeur de BASE: DERIVEE::DERIVEE (float d_1, ...char* d_m) :BASE (val_b_1...val_b_n); // // val_b_1...val_b_n sont les valeurs // des arguments b_1...b_n passes au // constructeur de la classe BASE // pour construire un objet DERIVEE { ... ; } Les destructeurs n’ont pas d’argument, pas de problème(s). GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 14/30 Polymorphisme (1) Je peux redéfinir une fonction: class BASE class DER:public BASE int main() { { { ... ... DER d; public: public: // ff de DER void ff(..); void ff (..); d.ff(..); ... ... // ff de BASE }; }; d.BASE::ff(..); } Notez le come-back de l’opérateur :: Les redéfinitions de fonctions sont dangereuses à manipuler... GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 15/30 Polymorphisme (2) Un pointeur sur une instance d’une classe dérivée peut être considéré comme un pointeur sur une instance de la classe de base. Dans l’autre sens le typage explicite est obligatoire . main() { BASE *p_base; DERIVEE *p_derivee; ... // licite du particulier au general p_base = p_derivee; // du general au particulier: requete explicite p_derivee = (DERIVEE *) p_base; ... } GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 16/30
  • 5. Fonctions virtuelles (1) Soit une classe matrice_carree. Je sais définir les méthodes mais la forme des données n’est pas fixée à priori: Matrice Symétrique Carrée Matrice Matrice tridiagonale ... ......... Matrice Pleine On aura une réalisation différente pour chaque classe dérivée. notion d’archétype. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 17/30 Fonctions virtuelles (2) Fonction virtuelles: class matrice_carree { // donnees: pas les elements public: virtual inverser(..); ... } Ceci signifie que je vais (éventuellement) redéfinir la méthode inverser dans les classes dérivées. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 18/30 Fonctions virtuelles (3) class matrice_symetrique: public matrice_carree { // donnes privees public: ... virtual inverser (...); }; class matrice_tridiagonale: public matrice_carree { // donnees privees public: ... virtual inverser (...); }; GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 19/30 Fonctions virtuelles (4) Fonction virtuelle, plus que la simple surcharge: mécanisme de la liaison dynamique. Une application peut utiliser matrice_carree sans connaître a priori les types qui seront dérivés: void f_appli (matrice_carree& m, ...) { ... m.inverser (); // on travaille sur le ... // type matrice_carree } GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 20/30
  • 6. Fonctions virtuelles (5) On ira chercher à l’exécution la réalisation de inverser correspondant au type réel de l’instance (celui de la déclaration). int main() { matrice_tridiagonale mt; // ici on utilisera pour "inverser" dans ‘‘f_appli’’ // la realisation de la classe derivee tridiagonale f_appli (mt, ..); ... } Si une fonction doit être redéfinie, utiliser une fonction virtuelle. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 21/30 Fonctions virtuelles (6) On ira chercher à l’exécution la réalisation de la méthode correspondant au type réel de l’instance (celui de la déclaration). C’est pour cette raison que le destructeur doit être virtuel. N.B. le constructeur ne peut être virtuel. Attention en cas de “simple surcharge” le choix sera fait à la compilation. Problème: l’éventuel surcoût du mécanisme (compilateurs “dévirtualiseurs”). GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 22/30 Classe abstraite (1) Une fonction virtuelle pure ne reçoit aucune réalisation par défaut. Une classe qui contient au moins une fonction virtuelle pure est une classe abstraite. class ABSTRAITE //Notion d’archetype { ... public: virtual void info(..)=0;//virtuelle pure }; Il n’est pas possible d’instancier un objet de type ABSTRAITE. Il faut écrire des classes dérivées de ABSTRAITE. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 23/30 Héritage multiple/ambiguités (1) Toutes les ambiguités d’accès doivent être levées à la compilation: class B_1 class B_2 class D: int main() {... {... public B_1, { public: public: public B_2 D vd; int i,ii; int* ii; { vd.i ..//OK de B_1 ... ... ... vd.B_1::ii//de B_1 }; }; }; vd.B_2::ii//de B_2 } Encore une fois, :: précise le référentiel. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 24/30
  • 7. Héritage multiple/duplication (1) Le graphe d’héritage peut amener la duplication d’une classe de base: liste_chaînée liste_de_A liste_de_B dérivé_A_B matrice_carree matrice_symétrique_définie_positive matrice_symétrique matrice_définie_positive Duplication souhaitable Duplication non souhaitable GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 25/30 Héritage multiple/duplication (2) Si on ne fait rien ==> duplication class GP class D1 class U: int main() {... :public GP public D1, { public: {... public D2 U u1; int i; }; { //GP via D1 ... ... u1.D1::i ... }; class D2 }; //GP via D2 public GP u1.D2::i ... {... } }; } L’utilisation de l’opérateur :: est obligatoire pour préciser le référentiel. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 26/30 Héritage multiple/duplication (3) Pour éviter la duplication: notion de “classe virtuelle”. class GP class D1: class U: int main() {... public virtual GP public D1, { public: {... public D2 U u1; int i; }; { u1.i .. ... class D2: ... //un seul i }; public virtual G }; //(de GP) {... }; }; Problème: l’héritage virtual n’est ni une propriété de GP, ni une spécification de U. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 27/30 Récapitulation-2 (1) Notions à bien comprendre: Héritage simple, multiple. privé/public/protégé. Fonctions virtuelles. Classes abstraites. Classes virtuelles. GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 28/30
  • 8. C++/Conclusions (1) La généricité est utile pour des logiciels de grande taille et dans l’optique réutilisation: les types paramètres (template); l’héritage simple; l’héritage multiple (difficile à gérer). GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 29/30 C++/Conclusions (2) Le langage C++ offre beaucoup de possibilités. mais. . . il est aussi très “permissif”. Il est indispensable d’avoir une méthodologie: faire le “tri” (quelle caractéristique est utile à un moment donné). suivre une démarche de réalisation (les types, leurs relations mutuelles). GIP RENATER Philippe d’Anfray Objets en C++ 2006-2007 – p. 30/30