Pb de méthode virtuelle sur Interface

Pb de méthode virtuelle sur Interface - C++ - Programmation

Marsh Posté le 16-08-2010 à 12:01:49    

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
Reply

Marsh Posté le 16-08-2010 à 12:01:49   

Reply

Marsh Posté le 16-08-2010 à 12:03:05    

dynamic_cast

Reply

Marsh Posté le 16-08-2010 à 12:11:31    

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
Reply

Marsh Posté le 16-08-2010 à 12:20:22    

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
Reply

Marsh Posté le 16-08-2010 à 13:57:17    

Reply

Marsh Posté le 16-08-2010 à 14:36:11    

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
Reply

Marsh Posté le 16-08-2010 à 14:57:08    

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)
Reply

Marsh Posté le 16-08-2010 à 15:25:54    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed