Appel d'une fonction virtuelle en C++
moi1
Messages postés
27
Date d'inscription
Statut
Membre
Dernière intervention
-
moi1 Messages postés 27 Date d'inscription Statut Membre Dernière intervention -
moi1 Messages postés 27 Date d'inscription Statut Membre Dernière intervention -
Bonjour a tous!
Désolé, question bete mais je ne trouve pas de reponse claire!
J'ai une classe qui est mon interface graphique, GUI. J'ai une 2ème clase appelée Essai, dérivée de la GUI. J'ai une 3ème qui s'appelle Tools. Je l'ai dérivée de "Essai". Ce qui donne: GUI mere deEssai mere de Tools. jusqu'ici, tout va bien.
J'ai déclaré une méthode virtuelle dans GUI et je veux appeler cette methode mais celle définie dans Tools. Et ca marche pas. C'est celle qui est dans GUI qui s'exécute. Si j'en déclare une dans Essai, c'est celle là qui s'execute.
Je pensais que c'etait la derniere définiton (hierarchiquement, donc celle de Tools)qui etait utilisée, j'ai faux?
Est-ce que ca pourrait etre un pb d'objet déclaré au mauvais endroit?
Merci de votre aide.
Laurent.
Désolé, question bete mais je ne trouve pas de reponse claire!
J'ai une classe qui est mon interface graphique, GUI. J'ai une 2ème clase appelée Essai, dérivée de la GUI. J'ai une 3ème qui s'appelle Tools. Je l'ai dérivée de "Essai". Ce qui donne: GUI mere deEssai mere de Tools. jusqu'ici, tout va bien.
J'ai déclaré une méthode virtuelle dans GUI et je veux appeler cette methode mais celle définie dans Tools. Et ca marche pas. C'est celle qui est dans GUI qui s'exécute. Si j'en déclare une dans Essai, c'est celle là qui s'execute.
Je pensais que c'etait la derniere définiton (hierarchiquement, donc celle de Tools)qui etait utilisée, j'ai faux?
Est-ce que ca pourrait etre un pb d'objet déclaré au mauvais endroit?
Merci de votre aide.
Laurent.
A voir également:
- Appel d'une fonction virtuelle en C++
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Fonction si et - Guide
- Machine virtuelle windows - Guide
- Regle virtuelle - Guide
- Appel privé - Guide
6 réponses
peux tu mettre un bout du code que tu utilises stp ? (genre le code appelant la fonction, par exemple)
Salut,
Comme précisé dans l'autre post, en C# (donc sous réserve en c++) tu peux utiliser this.mafonction au moment de l'appel.
Comme précisé dans l'autre post, en C# (donc sous réserve en c++) tu peux utiliser this.mafonction au moment de l'appel.
est tu sur que la variable d'apel de ta méthode est bien une Tool?
sinon, tu peux peu être utilise :
Tool(variable).methode();
mais comme dirai reeter : un exemple!
sinon, tu peux peu être utilise :
Tool(variable).methode();
mais comme dirai reeter : un exemple!
Je suis pas un vrai developpeur donc y'a surement des "trucs" qui m'echappent! En plus, c'est assez complexe car ce prog utilise plusieurs bibliothèques différentes.
J'ai un main qui déclare un objet de type Tool. Dans le constructeur de cet objet, je déclare un objet de type "Essai". Dans le constructeur de Essai, je déclare un objet de type GUI.
C'est correct jusque la ou y'a déja une betise?
Ensuite, l'utilisateur cliqe sur un bouton du menu qui doit appeler la fameuse methode "Clipping_Plane( )".
Le callback du bouton est "this->Clipping_Plane( )". Cette méthode est définie dans la classe GUI en virtual void. c'est donc la qu'est le probleme.
Je pense que l'objet qui appelle la méthode n'est pas l'objet de type Tool mais un autre, peut etre celui de Essai.
C'est difficile de mettre du code etant donné que c'est sur plusieurs fichiers et que finalement c'est "juste" un probleme d'appel mal placé je suppose.
Dites moi si qqch vous choque dans ce que je mets. C'est tres possible, encore une fois, je suis pas un pro!
J'ai un main qui déclare un objet de type Tool. Dans le constructeur de cet objet, je déclare un objet de type "Essai". Dans le constructeur de Essai, je déclare un objet de type GUI.
C'est correct jusque la ou y'a déja une betise?
Ensuite, l'utilisateur cliqe sur un bouton du menu qui doit appeler la fameuse methode "Clipping_Plane( )".
Le callback du bouton est "this->Clipping_Plane( )". Cette méthode est définie dans la classe GUI en virtual void. c'est donc la qu'est le probleme.
Je pense que l'objet qui appelle la méthode n'est pas l'objet de type Tool mais un autre, peut etre celui de Essai.
C'est difficile de mettre du code etant donné que c'est sur plusieurs fichiers et que finalement c'est "juste" un probleme d'appel mal placé je suppose.
Dites moi si qqch vous choque dans ce que je mets. C'est tres possible, encore une fois, je suis pas un pro!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je pense que l'objet qui appelle la méthode n'est pas l'objet de type Tool mais un autre
Je pense aussi.
l'erreur type, il me semble serai d'avoir une fonction:
f(GUI a)
{a.Clipping_Plane();
}
et de faire l'apel en fesant :
Tool b;
f(b);
de ce cas la, il vaut mieu declarer "f" comme ça:
f(GUI& a){...}
je ne voi que ça.
Si tu peux, test :
Tool a;
a.Clipping_Plane();
(apel de la methode juste après la declaration)
pour voir si la bonne methode est apeler.
Je pense aussi.
l'erreur type, il me semble serai d'avoir une fonction:
f(GUI a)
{a.Clipping_Plane();
}
et de faire l'apel en fesant :
Tool b;
f(b);
de ce cas la, il vaut mieu declarer "f" comme ça:
f(GUI& a){...}
je ne voi que ça.
Si tu peux, test :
Tool a;
a.Clipping_Plane();
(apel de la methode juste après la declaration)
pour voir si la bonne methode est apeler.
Je me demande si son problème ne vient pas de sa callback (oui bon ok, évidemment me direz-vous...)
En fait, sa callback est définie virtuelle dans GUI. J'imagine qu'il se sert d'un MESSAGE_MAP qui fait le lien entre l'évènement qu'il veut choper et sa fonction callback. Le lien est donc fait dans la class GUI, et non dans Tool, ce qui expliquerait que cela soit la fonction implémentée dans GUI qui soit appelée... Enfin tout ceci n'est qu'une supposition
Est-ce possible de dériver des callback ? j'ai jamais essayé...
En fait, sa callback est définie virtuelle dans GUI. J'imagine qu'il se sert d'un MESSAGE_MAP qui fait le lien entre l'évènement qu'il veut choper et sa fonction callback. Le lien est donc fait dans la class GUI, et non dans Tool, ce qui expliquerait que cela soit la fonction implémentée dans GUI qui soit appelée... Enfin tout ceci n'est qu'une supposition
Est-ce possible de dériver des callback ? j'ai jamais essayé...
Ok, merci pour ces conseils.
Des que j'ai le temps, j'essaie ce que vous m'avez dit.
Pour te repondre reeter, ma methode est virtuelle pour pouvoir le redefinir dans une classe fille. Ca marche quand je redefinie la methode dans la premiere classe fille. Mais quand je redefinie dans la deuxieme, c'est toujours la dfinition de GUI qui est appelée (sauf si je redefinie egalement dans Essai, auquel cas c'est celle ci qui est utilisée).
Pour moi ca doit etre un probleme d'objet mal declaré ou au mauvais endroit.
Je vais VRAIMENT apprendre le C++ avec un vrai bouquin!
Merci pour vos conseils!
Des que j'ai le temps, j'essaie ce que vous m'avez dit.
Pour te repondre reeter, ma methode est virtuelle pour pouvoir le redefinir dans une classe fille. Ca marche quand je redefinie la methode dans la premiere classe fille. Mais quand je redefinie dans la deuxieme, c'est toujours la dfinition de GUI qui est appelée (sauf si je redefinie egalement dans Essai, auquel cas c'est celle ci qui est utilisée).
Pour moi ca doit etre un probleme d'objet mal declaré ou au mauvais endroit.
Je vais VRAIMENT apprendre le C++ avec un vrai bouquin!
Merci pour vos conseils!
Est ce que les méthodes des classes mère sont bien toutes virtual ?
Enfin bon, soit dit en passant, le virtual en c++ c'est mal (c'est pour que le lien dynamique n'est pas fait automatiquement en c++, comme c'est le cas en java). En effet le compilo est du coup obliger de garder une référence vers ta classe mère pour voir quelle méthode tu exécutes par le lien dynamique.
A tester peut-être peux tu directement appeler la méthode dans ta section de code avec :
Bonne chance
Enfin bon, soit dit en passant, le virtual en c++ c'est mal (c'est pour que le lien dynamique n'est pas fait automatiquement en c++, comme c'est le cas en java). En effet le compilo est du coup obliger de garder une référence vers ta classe mère pour voir quelle méthode tu exécutes par le lien dynamique.
A tester peut-être peux tu directement appeler la méthode dans ta section de code avec :
Tool::methode()
Bonne chance