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:
Puis deux classes qui la dérivent, Geometric (paramètres géometriques) et Numeric (paramètres numérique):
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;
Geometric.h
Numeric.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;
Puis une classe Problem (gère différents problèmes: mathématiques, physiques, ...):
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;
Problem.h
Et une classe Math qui dérive Problem:
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;
Math.h
Math.cpp:
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;
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
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() ... }
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):
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; }
D'où l'impression que j'ai un problème de conception des classes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Geo(Geo* geo);
En espérant avoir été clair.
Merci de votre aide.
Partager