Salut,
J'ai une famille de classes pour lequelles j'ai défini une interface commune pour recevoir un visiteur :
La classe mère a la méthode suivante:
qui fait tout simplement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part virtual void accept(Visitor* visitor);
La méthode visit du visiteur peut recevoir plusieurs types dans la chaine d'héritage de la classe mère c'est à dire qu'il y a :
Code : Sélectionner tout - Visualiser dans une fenêtre à part visitor->visit(this);
Mon problème est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class Visitor { public: void visit(ClasseMere* instance); void visit(ClasseFille1* instance); void visit(ClasseFille2* instance); }
Si je créé un visiteur et que je le donne à la méthode accept() une instance de ClasseFille1 alors le code
me branche sur la méthode
Code : Sélectionner tout - Visualiser dans une fenêtre à part visitor->visit(this)
au lieu de
Code : Sélectionner tout - Visualiser dans une fenêtre à part void visit(ClasseMere* instance);
Je m'attendrais en effet à ce que visit() s'adapte au type concret ClasseFille1 de mon instance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part void visit(ClasseFille1* instance);
Par contre j'ai remarqué que si je redéfini accept() dans ClasseFille1 :
avec un code identique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part virtual void accept(Visitor* visitor);
Alors c'est bien la méthode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part visitor->visit(this);
qui est appelée
Code : Sélectionner tout - Visualiser dans une fenêtre à part void visit(ClasseFille1* instance);
Qui aurait une explication ? Quelle est la bonne façon de faire ?
Merci
Partager