Appel d'une fonction virtuelle en C++

Fermé
moi1 Messages postés 27 Date d'inscription jeudi 6 janvier 2005 Statut Membre Dernière intervention 23 mars 2007 - 8 nov. 2005 à 11:34
moi1 Messages postés 27 Date d'inscription jeudi 6 janvier 2005 Statut Membre Dernière intervention 23 mars 2007 - 9 nov. 2005 à 14:16
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.
A voir également:

6 réponses

Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005
8 nov. 2005 à 11:40
peux tu mettre un bout du code que tu utilises stp ? (genre le code appelant la fonction, par exemple)
0
teebo Messages postés 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
8 nov. 2005 à 12:26
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.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 nov. 2005 à 12:33
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!
0
moi1 Messages postés 27 Date d'inscription jeudi 6 janvier 2005 Statut Membre Dernière intervention 23 mars 2007
8 nov. 2005 à 13:25
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!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 nov. 2005 à 17:24
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.
0
Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005
9 nov. 2005 à 10:15
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é...
0
moi1 Messages postés 27 Date d'inscription jeudi 6 janvier 2005 Statut Membre Dernière intervention 23 mars 2007
9 nov. 2005 à 14:16
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!
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
9 nov. 2005 à 14:15
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 :

Tool::methode()


Bonne chance
0