Bonjour,
Je voudrais savoir si d'une manière ou d'une autre, il est possible d'avoir une fonction membre virtual d'une classe mère qui serait redéfinie dans les classes filles mais avec un type d'argument différent!
Je m'explique : mon programme est une application qui communique via des sockets avec plusieurs autres applications. J'ai donc créé une classe A (classe mère) qui représente globalement un correspondant pour mon appli, et des classe filles B, C, et D qui représentent chacune spécifiquement un de mes correspondants. Chaque fois que je reçois un "message" de l'un de ces correspondants, je dois faire un traitement spécifique derrière, donc j'ai une méthode de la classe mère "traiterMessage(TypeMessage &message)" implémentée dans chaque classe fille. Le problème, c'est que tous ces correspondants ne communiquent pas avec mon appli avec le même protocole, donc le type même de message reçu est différent (et la classe qui représente mon objet message).
Or, mon appli ayant une interface serveur, elle ne sait pas au moment où elle reçoit le message de qui il provient.
Un bout de code pour l'exemple :
Dans mon .h :
Et dans mon .cpp, j'ai 2 serveurs, pour les 2 protocoles différents, donc le premier j'ai :
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 class Protocole1 {} class A { virtual void traiterMessage(Protocole1 &message)=0; } class B : public A { void traiterMessage(Protocole1 &message); } class C : public A { void traiterMessage(Protocole1 &message); } class D : public A { void traiterMessage(Protocole2 &message); }
Voila, je ne sais pas si c'est tres clair, enfin toujours est it que ca ne compile pas puisque la méthode traiterMessage(Protocole1) n'est pas implémentée pour une des classe filles (la classe D).
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 Serveur1::donneesrecues() { A* monCorrespondant; Protocole1 message; ...... moncorrespondant->traiterMessage(message); } Serveur2::donneesrecues() { A* monCorrespondant; Protocole2 message; ... monCorrespondant->traiterMessage(message); }
Je me demandais donc si il y avait de faire cela "proprement", sans etre obligée de définir directement dans la classe mère 2 méthodes :
Merci!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 traiterMessage(Protocole1) traiterMessage(Protocole2)
Partager