Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1536 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Pb de méthode virtuelle sur Interface

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb de méthode virtuelle sur Interface

n°2017150
wapcamer
Posté le 16-08-2010 à 12:01:49  profilanswer
 

Bonjour les gens,
 
j'ai une petite question, surement très basique mais là j'ai un peu tout testé et je sèche.
Alors voilà, j'ai 2 classes disons Form1 et Form2 qui dérivent à la fois de la classe Form et d'une interface Calculator définie comme suit:
 

Code :
  1. class Calculator {
  2. public:
  3. Calculator();
  4. virtual ~Calculator();
  5. virtual void calculate()=0 ;
  6. };


 
Dans mon code, j'ai un objet dont un membre est un Form*parent passé en paramètre du constructeur et qui prend soit une instance Form1 ou Form2.
Dans un traitement de cet objet, je veux appeler la méthode calculate de ce *parent et donc je fais:

Code :
  1. Calculator* p= (Calculator*)parent;
  2. p->calculate();


 
Et là, il ne se passe rien. Dans le débugger, je vois bien que l'adresse de p et de parent sont la même, par contre, parent contient plein d'objets alors que p ne contient rien.
 
Si au contraire, je caste directement en FOrm1, à ce moment là j'ai bien la méthode calculate() de la classe considérée qui s'exécute:

Code :
  1. Form1* p= (Form1*)parent;
  2. p->calculate();


Mais bon, je ne mettrais pas d'interface si je savais à l'avance quelle classe était utilisée.
 
Autre chose, si je supprime les constructeurs et destructeurs de mon interface (la rendant ainsi une vraie interface au sens cpp), à l'issue du code ci-dessus avec le cast en (Calculator*), j'ai un joli appel au destructeur de mon Form1, ce qui n'est pas vraiment voulu  :whistle:  
Je ne vois pas d'où ça peut venir, dans la mesure où mon p* est par définition un pointeur et qu'il ne devrait pas supprimer l'objet pointé.
 
Merci de votre aide  :jap:  
 


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
mood
Publicité
Posté le 16-08-2010 à 12:01:49  profilanswer
 

n°2017152
Joel F
Real men use unique_ptr
Posté le 16-08-2010 à 12:03:05  profilanswer
 

dynamic_cast

n°2017156
wapcamer
Posté le 16-08-2010 à 12:11:31  profilanswer
 

Indeed merci bcp !
et ça semble résoudre les deux pbs en plus.
 
J'avais des static_cast dans bouts de code récupérés ici et là, et comme ça ne me semblait pas plus important que ça, j'ai continué en castant "normalement" sans me poser de questions.
 
Tu aurais une petite explication sur le pourquoi du dynamic_cast ?


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
n°2017164
wapcamer
Posté le 16-08-2010 à 12:20:22  profilanswer
 

J'en ai profité pour relire un peu sur le cast en C++.
Si je comprends bien, le cast classique comme j'avais fait, se fait lors de la compilation et non au runtime. du coup, effectivement, pas possible de savoir si l'instance est de type FOrm1 ou Form2.
 
Par contre pour le pb du destructeur parent, je ne vois pas.


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
n°2017195
Joel F
Real men use unique_ptr
Posté le 16-08-2010 à 13:57:17  profilanswer
 
n°2017213
wapcamer
Posté le 16-08-2010 à 14:36:11  profilanswer
 

merci Joel, c'est effectivement la page que j'avais lue dans ma réponse précédente.
Ma question sur le pb de destructeur reste - même si ce n'est pas critique.


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
n°2017219
Un Program​meur
Posté le 16-08-2010 à 14:57:08  profilanswer
 

Si tu fais un delete sur un pointeur l'objet a pour type dynamique une classe derivee du type pointe statiquement, il faut que le destructeur soit virtuel sous peine de comportement indefini.
 

Code :
  1. struct Base {
  2.    virtual ~Base() {} // obligatoire
  3. };
  4. struct Derivee: Base {};
  5. Base* ptr = new Derivee;
  6. delete ptr;


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2017228
wapcamer
Posté le 16-08-2010 à 15:25:54  profilanswer
 

Je suis bien d'accord.
la question, c'est pourquoi, en omettant le dynamic_cast, le delete est-il appelé?
En effet, je ne fais rien de tel dans mon code - et pour cause, je ne veux pas effacer le Form.
Dans mon exemple du 1er post, le pointeur *p se comporte comme un objet, qui serait détruit à la fin de la méthode puisqu'il est déclaré dedans.
Et du coup en supprimant la déclaration du destructeur dans ma classe Calculator, le programme se retourne vers le destructeur de Form1.
 
Bon je suis d'accord que c'est une erreur qui vient d'une autre erreur - et que je ne devrais pas perdre trop de temps dessus, mais j'aime bien comprendre.


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Pb de méthode virtuelle sur Interface

 

Sujets relatifs
VBA - Userform - Pb de superposition des images et des labelsPb Numérotation automatique sur modèle Excel
[PERL?] interface texte avec gestion des touches directionnellesC# obtenir l'IP d'une interface spécifique par son nom "window"
connection ODBC MySQL avec machine virtuelle[Javascript] Méthode générée dynamiquement
look ou bibliothéque d'interface builder c++PB affichage requete dans PHP
[OpenGl] Choisir la bonne méthode d'affichage (Vertex Array ?)PB création et utilisation VAR environement.
Plus de sujets relatifs à : Pb de méthode virtuelle sur Interface


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR