Bonjour
Dans le cas d'un dev professionnel, je dois réaliser la conception suivante.
Nous avons une classe A de base, et une classe dérivée B.
Nous avons enfin une classe C, qui possède un attribut qui peut etre de type A ou de type B selon la valeur d'un paramètre.
Alors voila ce que j'ai fait. Toutes les critiques sont pour moi bonnes a prendre.
La classe B hérite bien de A. La classe C possède en attribut un pointeur A. Mais ce pointeur peut avoir pour type dynamique le type B. La valeur du paramètre est passé dans le constructeur. Il s'agit dans ce cas u. Si u vaut 1 alors elem est de type A, sinon il est de type B. D'un point de vue théorique, cela me semble bien.
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 class A{ public: A(int u):a(u){}; A(){}; private: int a; }; class B:public A{ public: B(int x1,char* x2):A(x1),x(x2){}; char* getunChar(){ return x; } private: char* x; }; class C{ public: C(int i,char*); char* getChar(){ return ((B*)elem)->getunChar(); } private: A* elem; }; C::C(int u,char* chaine){ if(u==1) { elem =new A(1); } else { elem = new B(4,chaine); } } int main(){ char *x="ee"; C unobjet(2,x); std::cout<<unobjet.getChar(); }
Il faudrat bien sur dans le destructeur faire un delete de elem, ce que j'ai fait ici:
J'ai enfin une dernière question. Pourquoi ne faut il pas faire ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 C::~C() { delete elem; }
Je vous rermercie pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 C::C(int u,char* chaine){ if(u==1) { elem =&A(1); } else { elem = &B(4,chaine); } }
Partager