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

  FORUM HardWare.fr
  Programmation
  C++

  Pointeurs de fonctions et polymorphisme

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pointeurs de fonctions et polymorphisme

n°1712921
preposteru​s
Posté le 04-04-2008 à 17:56:57  profilanswer
 

Bonjour, je cherche à savoir si c'est possible de déclarer un function pointer dans une base qui soit utilisable dans les dérivées ; c'est à dire dans l'idée un membre void (Base::*foo)() qui deviendrait un void (Derived::*foo)() selon où il se trouve . Pour l'instant j'ai tenté un boost::function<void(Base*)> qui me donne "cannot convert from Base* to Derived*" quand je m'en sers

mood
Publicité
Posté le 04-04-2008 à 17:56:57  profilanswer
 

n°1713251
el muchach​o
Comfortably Numb
Posté le 05-04-2008 à 23:37:24  profilanswer
 
n°1713391
preposteru​s
Posté le 06-04-2008 à 17:05:44  profilanswer
 

Non, pas de static que ce soit le pointeur ou les fonctions que j'y met

n°1713427
preposteru​s
Posté le 06-04-2008 à 19:07:09  profilanswer
 

Je viens de trouver un truc qui a l'air de marcher (je pige pas trop mais bon) :
fptr=static_cast<void ( Base::* )()>(&Derived::Bidule);

n°1713432
jesus_chri​st
votre nouveau dieu
Posté le 06-04-2008 à 19:27:11  profilanswer
 

pointeur de méthode virtuelles ?
Ton cast là c'est ce que génère le compilo avec une méthode virtuelle, le pointeur étant stocké dans une vtable.
 
Et tout cast de pointeur de méthode est non-portable, et nécessite un reinterpret_cast. Rien ne te dis que les pointeurs de Base::* et de Derived::* ont la même longueur. Si Derived hérite de Base par héritage multiple ou virtuel ça sera surement pas le cas d'ailleurs.
 
Si tu veux éviter une méthode virtuelle par souci de perfs (ce dont je te féliciterais au passage) tu peux faire une méthode Bidule et une méthode Bidule_virtual qui apellerait la méthode bidule normale. Ou encore appeller Bidule explicitement avec Base::Bidule ou Derived::Bidule.

n°1713473
preposteru​s
Posté le 06-04-2008 à 20:42:12  profilanswer
 

A vrai dire c'est plus par flemme d'utiliser un pattern state ou strategy, le but est d'avoir un  
std::vector<void (Base::*)()> states;
que chaque dérivée initialise comme elle veut  
states.push_back(reinterpret_cast<void (Base::*)()>(&UneDerivee::Machin));
states.push_back(reinterpret_cast<void (Base::*)()>(&UneDerivee::Truc));
etc
après on fait (*this.*states[currentState])(); ...
En tout cas je ne compte pas avoir d'héritage virtuel ou multiple .

n°1713513
jesus_chri​st
votre nouveau dieu
Posté le 06-04-2008 à 23:07:24  profilanswer
 

Code :
  1. class Base
  2. {
  3. public :
  4.     Base();
  5.     virtual void Machin();
  6.     virtual void Bidule();
  7.     virtual void Truc();
  8. };
  9. class Derived : public Base
  10. {
  11. public :
  12.     Derived();
  13.     virtual void Machin();
  14.     virtual void Bidule();
  15.     virtual void Truc();
  16. };
  17. std::vector< void (Base::*)() > vec;
  18. vec.push_back( &Base::Machin );
  19. vec.push_back( &Base::Bidule );
  20. Base b;
  21. Derived d;
  22. (b.*(vec[0]))(); // appelle Base::Machin()
  23. (b.*(vec[1]))(); // appelle Base::Bidule()
  24. (d.*(vec[0]))(); // appelle Derived::Machin()
  25. (d.*(vec[1]))(); // appelle Derived::Bidule()


 
et aucun cast !

n°1713515
jesus_chri​st
votre nouveau dieu
Posté le 06-04-2008 à 23:09:22  profilanswer
 

(*this.*states[currentState])(); ...  
 
non c'est
 
(this->*states[currentState])();
 
mais ton compilo te l'aurait dit :D


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

  Pointeurs de fonctions et polymorphisme

 

Sujets relatifs
classes dérivées et pointeursPHP4 inclut elle les fonctions Mysql (mysql_connect...) ?
Petite question sur la stl et les pointeurs.fonctions aléatoires et variables
appel de fonctions membreCompteur de visite journaliére, fonctions de date en sql
je ne sais pas comment manipuler les pointeurs :([Javascript] Problème entre deux fonctions
utiliser les fonctions id3 avec phpAide pour optimiser mon code => insert bdd
Plus de sujets relatifs à : Pointeurs de fonctions et polymorphisme


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