Bonjour.
J'ai un programme contenant une classe Menu (je vous donnerais le .h en dessous) , qui contient un vecteur de Menu_Object. Tout marchait bien jusqu'à l'héritage :
Menu me permettait d'accéder à la classe Menu_Object (via une fonction) est ainsi la fonction virtual actualise.
Dès que j'ai commencé l'héritage en créant une classe Label, fille de Menu_Object, je me suis aperçu d'un problème :
Puisque Menu contenait un vecteur de Menu_Object, comment accéder à la fonction actualise de mon Label puisqu'il est stocké comme un Menu_Object ?
Existe-il une solution sans changer l'architecture ?
Au passage, Menu_Object contient un int type supposé pouvoir m'indiquer si l'objet est un Label ou non.
Dois-je changer mon vecteur de Menu_Object en un vecteur de void* + un vecteur de int contenant le type, puis caster quand j'appel la fonction actualise ?

Voici mon code :

Menu.h

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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef DEF_MENU
#define DEF_MENU
 
#include "Menu_Object.h"
#include "Label.h"
 
class Menu
{ 
	private :
		vector<Menu_Object> MyMenu;
		vector<bool(*)(Menu&, void*, void*)> callback_functions;
		vector<void*>fc_param;
		void(*exit_function)(Menu&,void*);
		void*param;
		BITMAP*tampon;
	public :
		Menu(vector<Menu_Object>, void(*exit_function)(Menu&,void*)=NULL);
		Menu(Menu_Object, void(*exit_function)(Menu&,void*)=NULL);
 
		void add_callback_fc(bool (*)(Menu&,void*, void*), void* =NULL);
 
 
		bool do_callback_functions();
		void exit_fc();
 
		void add_object(Menu_Object);
		int get_num_objects();
		Menu_Object& get_menu_object(int);
		bool is_on_object(int,double, double);
		int is_on_which_object(double,double);
 
		void dessiner();
};
Menu_Object.h
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
#ifndef DEF_MENU_OBJECT
#define DEF_MENU_OBJECT
 
#include <vector>
using std::vector;
#include "Rectangle.h"
 
 
 
class Menu;
class Menu_Object
{
	protected : 
		int type;
		bool selection;
		int ordre;
		bool visible;
		vector<bool(*)(Menu&,int, void*,void*)>callback_functions;
		vector<void*> fc_param;
		Rectangle zone;
		BITMAP*image_tmp;
		bool actualiser; 
	public :
		Menu_Object(int,int,Rectangle&,bool=true);
 
		int get_ordre();
		int get_type();
		void set_ordre(int);
		bool get_selection();
		void set_selection(bool);
		bool get_visible();
		void set_visible(bool);t
 
		bool do_callback_functions(Menu&, int, void*);
		void add_callback_function(bool(*)(Menu&, int, void*, void*), void* =NULL);
 
		Rectangle& get_rectangle();
 
		virtual void actualise();
		void dessiner(BITMAP*);
};
 
#endif
et enfin Label.h
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
#ifndef DEF_LABEL
#define DEF_LABEL
 
#include "Menu_Object.h"
 
#include <alfont.h>
#define DEFAULT_FONT "comic sans ms.ttf"
#define LABEL_TYPE 1
 
using namespace std;
 
class Label : public Menu_Object
{
	private :
		ALFONT_FONT*police;
		string value;
		int col_texte; 
		int col_fond_texte;
		int underlined;
	public :
		Label(int,Rectangle&,bool=true);
		Label(string, ALFONT_FONT*, int,Rectangle&,bool=true);
 
 
		ALFONT_FONT* get_police(); 
		bool set_police(char*);
		bool set_police(string);
		bool set_police(ALFONT_FONT*);
		int get_col_texte();
		bool set_col_texte(int);
		int get_backcol_texte();
		void set_backcol_texte(int);
		bool delete_caract(int, int);
		bool add_caract(char, int);
		bool add_caract(char*, int);
		bool add_caract(string, int);
		int get_underlined();
		bool set_underlined(int);
 
		virtual void actualise();		
};
 
#endif

Avez-vous des idées ? Faut-il que je reconsoive toute l'architecture du programme ? Si oui, pouvez-vous me donner une piste ?
Merci de votre aide.