0% ont trouvé ce document utile (0 vote)
3 vues11 pages

Destructeur virtuel en C++

Le document traite des concepts d'héritage et de polymorphisme en C++, en expliquant la redéfinition des méthodes, la gestion des constructeurs et destructeurs, ainsi que les types d'héritage. Il aborde également la bibliothèque STL, qui fournit des conteneurs et des itérateurs pour gérer des ensembles de données efficacement. Enfin, il souligne l'importance des méthodes virtuelles pour le polymorphisme et la création de classes abstraites.

Transféré par

sindasahmima
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
3 vues11 pages

Destructeur virtuel en C++

Le document traite des concepts d'héritage et de polymorphisme en C++, en expliquant la redéfinition des méthodes, la gestion des constructeurs et destructeurs, ainsi que les types d'héritage. Il aborde également la bibliothèque STL, qui fournit des conteneurs et des itérateurs pour gérer des ensembles de données efficacement. Enfin, il souligne l'importance des méthodes virtuelles pour le polymorphisme et la création de classes abstraites.

Transféré par

sindasahmima
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Chapitre 3 +4 c++

Partie 1 : Héritage
 Concept & Principe

 Redéfinition des méthodes de base


Les méthodes redéfinies de la classe de base demeurent accessibles via
l'opérateur de résolution de portée ("::").(remplace le super en java )

 Redéfinition des membres données d’une classe dérivée


 Redéfinition et surcharge

Quand tu déclares une nouvelle méthode f(...) dans la classe dérivée B, le compilateur
cache toutes les méthodes f(...) de la classe de base A, même si elles ont une signature
différente.

 Constructeur et destructeur
Lors de la création d’un objet d’une classe dérivée, les
constructeurs sont appelés dans l’ordre suivant:
1) Les constructeurs des objets attributs de la classe de base,
2) Le constructeur de la classe de base,
3) Les constructeurs des objets attributs de la classe dérivée;
4) Le constructeur de la classe dérivée.
Les destructeurs sont appelés en ordre inverse des
constructeurs.
Exemple :

 Transmission d'informations entre constructeurs


Pour appeler le constructeur de la classe de base il suffit de l’appeler a coté du
constructeur de la classe dérivé et avant le «{«
Si le constructeur de la classe de base est sans paramètre, alors il sera appelé
automatiquement.

 Type d’héritage : Le type d’héritage est spécifié après le symbole :


class pointcol : [type d’heritage] point
Par défaut, le type d’héritage est privé.
class pointcol : point class pointcol: private point

Le Type d’héritage conditionne la visibilité des héritiers

Rq :Les membres protégés sont :


● inaccessibles à l'utilisateur de la classe ,comme des
membres privés(les objet de l’instanciation dans le main) .
● accessibles aux membres d'une éventuelle classe
dérivée,
● inaccessibles aux utilisateurs de cette classe dérivée(les objet de l’instanciation de
la classe dérivé dans le main )
 Conversion d'un type dérivé en un type de base :
point a ;

pointcol b ;

Que fait a = b; ?

 Comme b est un pointcol, il est converti en point (automatiquement car pointcol hérite
de point). et l'affectation du résultat à a.

 Seule la partie point de b (donc x et y) est copiée dans a.

l'affectation b=a serait rejetée

 Conversion de pointeurs

//conversion du pointeur adp en pointcol

 Méthodes non héritées

Les classes dérivées n’héritent pas :

 Des constructeurs (défaut, paramètres, copie);


 Du destructeur;
 De l’opérateur d’affectation;
 Des relations d’amitié.

Le constructeur de recopie et l’héritage :

Cas Comportement
Classe dérivée sans C++ génère un constructeur de recopie par défaut, qui appelle
constructeur de recopie celui de la classe de base + copie ses propres membres
Classe dérivée avec
Tu dois appeler toi-même le constructeur de recopie de la
constructeur de recopie
base dans la liste d'initialisation
explicite

il y aura conversion implicite de b dans le type A


 L’opérateur d’affectation et l’héritage : Si on a un opérateur= dans la classe
de base et aucun opérateur= dans la classe dérivée; Alors, le compilateur va
appeler l’opérateur= de la classe de base et recopie attribut par attribut les
attributs de la classe dérivée puis ses propre attributs
 Héritage multiple :Une classe héritière possède plusieurs classes parentes

si un même identifiant(nom d’une méthode) est utilisé dans deux classes parentes on le redefini
dans leur sous classe c

héritage Virtual : sert À éviter les duplications de la classe de base quand plusieurs chemins
d’héritage mènent à elle

 Partie 2 : Polymorphisme "plusieurs formes"


Ce terme désigne la capacité qu'a une méthode de s'adapter automatiquement a l'objet manipule.

Principale application : regroupement d'objets dans des listes hétérogènes.

 Conversion de pointeur sur objet trans-typage :


AaBb ;
B sous classe de A
afff() une methode de A et qui est redéfini dans B

B*adpc=&b ;
A*adp=&a ;

adp=adpc ; (upcasting)
adp—>aff( )(normalement il doit appeler [Link]()mais il appelle aaff())
Ce problème s’appelé :une ligature statique : le choix de la méthode à appeler a été réalisé
lors de la compilation ; il a donc été fait en fonction du type de la variable adp.

Solution :ajouter Virtual avant la méthode aff()(en ambiguïté )


Pour dire au compilateur d’utiliser une ligature dynamique(le choix de la fonction est

effectué qu'au moment de l'exécution.)

Rq : Cependant, un constructeur ne pourra jamais l’être virtual.


Remarque :

Destructeur virtuel :
Destruction d’un objet de la classe dérivée qui est référencé par un pointeur de la classe de
base,A* a=newb() ;
Résultat
● Si le destructeur est virtuel dans la classe de base
alors (delete a ;) appele le destructeur de la classe de base et de la classe dérivée
Sinon seul le destructeur de la classe de base est appelée

 Les fonctions virtuelles pures pour la création de classes abstraites


Une classe qui possède au moins une fonction virtuelle pure(initialisateur = 0) est une
classe abstraite et ne peut donc jamais être instanciée
● La classe abstraite ne peut pas être passée en paramètre comme objet statique. void
test(ABSTRACT_CLASS a); // ❌ ERREUR si passage par valeur
Cependant elle peut être passée par pointeur (Abstract*) ou par référence (abstract&)
(c’est le polymorphisme).
Les sous-classes d’une classe abstraite doivent implémenter ces fonctions virtuelles
pures, sinon elles aussi deviennent abstraites.
● Structure Polymorphe = Collection d’objets d’uneclasse de base comportant des
méthodes virtuelles
Tab est rempli d’objets de type Sphere et/ou Cube
l’opérateur typeid permet de connaître le type d’un objet lors de l’exécution
ObjetGeo *Tab[N];
int nbCube=0;
for(i=0; i<N; i++)
if ( typeid( *Tab[i] ) == typeid( Cube))
nbCube++;
Probleme :les pointeur sont typé ,il ya par defaut ligature statique
Solution : ligature dynamique

Apres l’ajout de Virtual avant la méthode affiche dans la classe de base :


(auto,moto sont des classe dérivées de la classe abstraite véhicule )

Rq :une classe dont tous ses methode sont virtual pure est une interface

Chapitre 4 : STL en C++ (standard template library) :


Il s’agit d’une bibliothèque générique qui fournit des solutions pour gérer un ensemble
de données en utilisant des algorithmes efficaces
Les composants STL
Exemple de conteneur séquentiel : vector <double> ld ; /* vecteur vide d’éléments de
type double

VECTOR :
 Tableau dynamique
 Les éléments sont insérés à la fin du tableau

Itérateurs
Un itérateur est un objet qui permet de naviguer dans les éléments d’un conteneur
 Opérateur * : Retourne l’élément de la position courante
 Opérateur ++ : Fait pointer l’itérateur à l’élt suivant
 Opérateur == : Indique si 2 itérateurs pointent le même élément
 Opérateur = : Assigne un itérateur
Parcours d'un conteneur avec un itérateur :

Parcours inverse de l’iterator


Itérateurs – utilisation :
container::iterator :permet de naviguer en mode lecture/écriture
container::const_iterator :permet de naviguer en mode lecture seulement

Itérateurs – catégories

Vous aimerez peut-être aussi