Bonjour,

J'ai un problème que je vais illustrer ci-dessous, par contre je ne sais pas si c'est moi qui gère mal le polymorphisme ou si c'est un problème de conception, je vais essayé d'être clair:

On a une classe Param qui gère des paramètres:

Param.h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
class Param
{
public:
  Param();
  ...
  double getCommonParam();
private:
  double m_common;
Puis deux classes qui la dérivent, Geometric (paramètres géometriques) et Numeric (paramètres numérique):

Geometric.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
class Geometric : Param
{
public:
  Geometric();
  Geometric(double& common, double& param);
   ...
   double getGeoParam();
private:
   double m_param;
Numeric.h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
class Numeric : Param
{
public:
  Numeric();
   ...
   double getNumericParam();
private:
   double m_param1;
   double m_param2;
Puis une classe Problem (gère différents problèmes: mathématiques, physiques, ...):

Problem.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
class Problem
{
public:
  Problem();
  ... 
private:
  Param* m_param;
Et une classe Math qui dérive Problem:

Math.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
class Math : Problem
{
public:
  Math();
  ...
  void initParam(double& common, double& param);
  void initParam(double& common, double& param1, double& param2);
  void calculGeo();
 
private:
  double m_resGeo;
  double m_resNum;
Math.cpp:
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
#include "Math.h"
...
// pas de problème, m_param est bien reconnu comme un objet de type Geo
void Math::initParam(double& common, double& param)
{
  m_param = new Geo(common, param);
}
// par contre comment faire comprendre que m_param est un Geo ici
void Math::calcGeo()
{
  ...
  // et faire par exemple
  m_param.getGeoParam(); // impossible, ne propose que getCommonParam()
  ...
}
J'avais pensé modifier void Math::initParam(double& common, double& param) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
void Math::initParam(double& common, double& param)
{
  Geo* geo = new Geo(common, param);
  m_param = geo;
}
Mais je suis pas sûr que ce soit une bonne idée et de plus je devrai ajouter un constructeur de copie avec un pointeur en argument (je sais pas comment faire cela):
D'où l'impression que j'ai un problème de conception des classes.

En espérant avoir été clair.

Merci de votre aide.