list et methodes virtuelles
Salut,
le probleme que je soulève est surement bateau mais je ne le comprends pas.
J'ai la hiérarchie de classe suivante:
Code:
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();
}; |
Ce sont des widgets pour une interface graphique. Il y a des boutons et des boutons particuliers, les ToggleButton.
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:
Code:
1 2
|
std::list<Button> actions_; |
Finalement, dans une méthode de la classe Menu, je parcours les widgets pour en appeler la méthode handleFocusLost() ainsi:
Code:
1 2 3 4 5 6 7
|
for (std::list < Button>::iterator it = actions_.begin();
it != actions_.end(); it++) {
Button & b = *it;
b.handleFocusLost();
} |
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.
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:
Code:
std::list<Button*> actions_;
Quelqu'un a t-il l'explication?