Salut,
le probleme que je soulève est surement bateau mais je ne le comprends pas.
J'ai la hiérarchie de classe suivante:
Ce sont des widgets pour une interface graphique. Il y a des boutons et des boutons particuliers, les ToggleButton.
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 class Widget { public: Widget() {} virtual ~Widget() {} virtual void draw() = 0; }; class Button : public Widget { public: //! Constructs a new button. Button() : Widget() { } ~Button() { } //! Draw the widget on screen void draw(); virtual void handleFocusLost(); }; class ToggleButton : public Button{ public: //! Constructs a new button. ToggleAction(int x); virtual void handleFocusLost(); };
Par ailleurs j'ai une classe Menu qui affiche tous ses widgets et qui maintient donc une liste de widget, déclarée ainsi dans la classe:
Finalement, dans une méthode de la classe Menu, je parcours les widgets pour en appeler la méthode handleFocusLost() ainsi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::list<Button> actions_;
Mais a l'exécution (en mettant une trace spécifique a chaque implémentation de méthode), le code précédent appelle systématiquement l'implémentation de la classe Button même si j'ai à faire à une instance de ToggleButton.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 for (std::list < Button>::iterator it = actions_.begin(); it != actions_.end(); it++) { Button & b = *it; b.handleFocusLost(); }
Pourquoi est-ce le cas? La méthode handleFocusLost() est pourtant déclarée virtuelle.
J'ai remarqué que j'ai un bon fonctionnement lorsque j'utilise des pointeurs tel que:
Quelqu'un a t-il l'explication?
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::list<Button*> actions_;
Partager