OVH Cloud OVH Cloud

Heritage et pointeur de méthodes

1 réponse
Avatar
Mathieu Peyréga
Bonjour, le code suivant pose un problème avec Visual C++ service pack
5. Est-ce normal du point de vue C++ où est-ce un problème lié au
compilateur ?
(l'erreur est une impossibilité de caster void (Fille::*)(void) en void
(Mere::*)(void) de façon implicite (type sans point commums d'après le
compilo).

Cordialement,

Mathieu

#include <map>
class Mere
{
public:
std::map<int, void (Mere::*)(void)> m_CallBackMap;
void EnregistreCallBack(int index, void (Mere::*pCallBack)(void));
void ExecuterCallBack(int index);
};

void Mere::EnregistreCallBack(int index, void (Mere::*pCallBack)(void))
{
m_CallBackMap[index] = pCallBack;
}

void Mere::ExecuterCallBack(int index)
{
(this->*m_CallBackMap[index])();
}

classe Fille : public Mere
{
public:
Fille(void);
onEvenementA(void);
onEvenementB(void);
};

Fille::Fille(void)
{
EnregistreCallBack(1,&Fille::onEvenementA);
EnregistreCallBack(2,&Fille::onEvenementB);
}

1 réponse

Avatar
Thomas Parle
"Mathieu Peyréga" a écrit dans le message
de news:
Bonjour, le code suivant pose un problème avec Visual C++ service pack
5. Est-ce normal du point de vue C++ où est-ce un problème lié au
compilateur ?
(l'erreur est une impossibilité de caster void (Fille::*)(void) en void
(Mere::*)(void) de façon implicite (type sans point commums d'après le
compilo).


Bonjour,
sans lire la suite du code, il faut noter que (Fille::*)(void) et
(Mere::*)(void) sont deux types bien différents, chacun désignant un
pointeur vers une fonction sans paramètres des classes Fille et Mere
respectivement. D'où l'impossibilité de cast 'explicite/propre' entre ces
types. C'est donc 'normal' du point de vue C++.