Bonjour,

La question que je vais poser ici est basique, mais le fait est que je n'arrive pas à y trouver de réponse. Je n'arrive pas à saisir comment utiliser le correctement polymorphisme.

Je prends un exemple très simple pour illustrer mon problème :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Transformable
{
protected :
   float   pos_x;
   float   pos_y;
   float   rotation;
};
 
class Player : public Transformable
{
public :
   void   set_name( const std::string& name );
protected :
   std::string   name;
};
 
class Building : public Transformable
{
public :
   void   open_door( void );
protected :
   bool   is_door_open;
};
Imaginons que je veuille faire un jeu, qui contiendrait de nombreux objets différents ayant tous leurs propres spécificités ainsi que certains points en commun (des joueurs, des arbres, des armes...). Si je les stocke par polymorphisme sur un pointeur, comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
std::list< Transformable* >   object_list;
 
object_list.push_back( new ( Player ) );
object_list.push_back( new ( Player ) );
Tous mes objets sont stockés dans la même liste, mais je perds l'accès aux méthodes des classes filles de Transformable. Je sais bien qu'il est possible d'employer des virtuelles pures pour surplanter des méthodes de la classe mère, mais imaginons que mes classes filles possèdent certaines méthodes qui leur sont propres. Il y a possibilité de downcaster, mais j'ai lu que c'était à éviter car crado. Pour contourner le problème, je pourrais stocker mes objets par catégorie :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
std::list< Player* >     players_list;
std::list< Building* >   buildings_list;
Sauf que ça me paraît franchement sale, surtout si il y a beaucoup d'objets différents et que les listes se multiplient.

Du coup, j'en arrive à ma question : Comment stocker mes objets de la manière la plus générique possible sans pour autant perdre des méthodes au passage? Quelle est la manière idéale de faire cela en C++?

Merci d'avance.