Pointeurs de fonctions et polymorphisme - C++ - Programmation
Marsh Posté le 05-04-2008 à 23:37:24
Un pointeur static ?
Marsh Posté le 06-04-2008 à 17:05:44
Non, pas de static que ce soit le pointeur ou les fonctions que j'y met
Marsh Posté le 06-04-2008 à 19:07:09
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);
Marsh Posté le 06-04-2008 à 19:27:11
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.
Marsh Posté le 06-04-2008 à 20:42:12
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 .
Marsh Posté le 06-04-2008 à 23:07:24
Code :
|
et aucun cast !
Marsh Posté le 06-04-2008 à 23:09:22
(*this.*states[currentState])(); ...
non c'est
(this->*states[currentState])();
mais ton compilo te l'aurait dit
Marsh Posté le 04-04-2008 à 17:56:57
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