Je sui confronté à un petit problème pourtant relativement commun : j'ai créé pour un programme une structure de liste chainée très primaire et j'aimerai lui rajouter des membres de données et des méthodes grâce à l'héritage afin de lui ajouter certaines fonctionnalitées utiles à certains endroits du programme (tout en gardant la classe servant de base car également utilisée).
Ma classe de liste basique s'apparente à ca :
Où next représente un pointeur vers l'élément suivant de la liste bien entendu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class Liste { public: // Méthodes... private: // Membres de données Liste *next; };
Le problème, étant que lors de la création de ma classe ListeEtendue, par héritage public de liste, le pointeur nommé précédement "next" reste de type Liste et ne prends pas le type ListeEtendue.
Aussi ma question est : existe il une manière académique / ou éprouvée de traiter le problème ?
Certaines personnes m'avaient conseillé d'avoir recours à des fonctions virtuelles avec du cast, mais je trouve que ca complexifie beaucoup la chose pour un problème tout de même très simple (surtout que je préfererai que l'utilisateur puisse utiliser simplement cette classe).
Personnelement j'ai procédé de la sorte :
( l'héritage "vide" de Liste à partir de BaseListe s'expliquant par l'impossibilité d'avoir recours à un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 // Squellette de base de la liste : aucun n'objet ne sera instancié de cette dernière template <class T> class BaseListe { // Membres et méthodes publiques et privées T *next; } // Ma liste basique class Liste : public BaseListe<Liste> { }; // Ma liste étendue class ListeEtendue : public BaseListe<ListeEtendue> { // Méthodes et membres de données supplémentaires })
Code : Sélectionner tout - Visualiser dans une fenêtre à part class List; typedef BaseList<List> List;
Ca marche, mais je me demandai s'il n'existait pas une meilleure solution (simple!). Merci.
Partager