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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
virtual void accept(Visitor* visitor);
qui fait tout simplement :
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
1
2
3
4
5
6
7
class Visitor
{
public:
void visit(ClasseMere* instance);
void visit(ClasseFille1* instance);
void visit(ClasseFille2* instance);
}
Mon problème est le suivant :

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
void visit(ClasseMere* instance);
au lieu de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
void visit(ClasseFille1* instance);
Je m'attendrais en effet à ce que visit() s'adapte au type concret ClasseFille1 de mon instance.

Par contre j'ai remarqué que si je redéfini accept() dans ClasseFille1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
virtual void accept(Visitor* visitor);
avec un code identique :
Alors c'est bien la méthode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
void visit(ClasseFille1* instance);
qui est appelée

Qui aurait une explication ? Quelle est la bonne façon de faire ?

Merci