SCPCD Le 13/03/2012 à 13:55 pour apperler ton "OnEnterBackground" de "Player", il faut que ton pointeur d'objet "pApp" pointe sur un objet de type "Player" :
l'exemple suivant ne fonctionne pas car "pApp" n'est pas initialisé (c'est un pointeur fou)
int main()
{
AppBase *pApp;
pApp->OnEnterBackground();
return 0;
}
Exemples qui fonctionnent : (sans le template pour le test)
#include <stdio.h>
class AppBase
{
public:
virtual void OnEnterBackground() { printf("methode de AppBase\n"); }
};
class App : public AppBase
{
public:
virtual void OnEnterBackground()
{
printf("methode de App\n");
}
};
class Player : public App
{
public:
virtual void OnEnterBackground(void);
};
void Player::OnEnterBackground()
{
printf("DidEnterBackground\n");
}
int main()
{
// appel la methode de AppBase
AppBase *pAppBase = new AppBase();
pAppBase->OnEnterBackground();
delete pAppBase;
// appel la methode de App
AppBase *pApp = new App();
pApp->OnEnterBackground();
delete pApp;
// appel la methode de Player
AppBase *pPlayer = new Player();
pPlayer->OnEnterBackground();
delete pPlayer;
return 0;
}
Il faut donc que tu récupères soit une référence, soit un pointeur sur ton objet instancié quelque part en mémoire.
Tu dois avoir un moyen pour récuperer cet objet généralement soit par un parametre à ta méthode, soit en utilisant un getter sur une classe associé voir à partir d'une classe singleton.

Il faudrait voir la façon dont AppBase *pApp; est initialisé si possible ?
En note : il n'y a pas de cheminement, une seule fonction sera appelée.
Je suis quand même surpris que la fonction virtuelle dans le template passe à la compilation.
Ya pas un problème de conception quand on doit appeler une méthode d'une classe dérivée² dans une classe grand-mère ?
Pen^2 Le 13/03/2012 à 22:35Edité par Pen^2 le 13/03/2012 à 22:56 Quand tu es obligé d'y faire appel via un cast sauvage de la part du codeur, si, c'est souvent mauvais signe.
Mais là, la méthode OnEnterBackground est déclarée dès la classe mère (qui d'ailleurs est une classe virtuelle pure, ie dont au moins une méthode doit être définie dans une classe dérivée.)<=edit, dsl elle n'est pas virtuelle pure, j'avais lu trop vite
Vu. En fait, dans le cas d'Orion, il a juste cherché à compléter sa classe mère, non ?
Pen^2 Le 13/03/2012 à 22:54 Oué, si j'ai bien compris il a ajouté OnEnterBackground (qui n'est pas virtuelle pure, dsl j'ai mal lu, elle est simplement "virtual") dès la classe mère, et l'a ajoutée au passage aux classes filles (ce qui n'était pas utile s'il ne la redéfinit pas, d'ailleurs : son ajout dans App est superflu dans son exemple)
C'est à ça que je pensais :
class A
{
template <class T> virtual void foo(T & x) {.......}
};
Au moment de la compilation tu ne peux pas savoir combien tu vas en avoir, puisqu'il peut y en avoir d'autres dans d'autres sources, et tu vas être sacrément emmerdé au moment de linker. J'imagine qu'on pourrait résoudre partiellement la question en traquant les références dans la vtable pour les corriger au linkage, mais ça serait furieusement compliqué.
Link Le 09/04/2012 à 09:39 La règle telle que je me la formule, c'est qu'une méthode virtuelle ne peut pas être "plus template que sa classe". Ce qui n'est pas le cas ici.

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.