Bonjour à tous.
Dans le cadre d’un problème d’intégration à un ensemble applicatif préexistant je suis confronté au problème suivant de réécriture d’un constructeur de copie :

Je travaille sur une classe A et sur une classe B, avec l’indication que B est une classe virtuelle pure que j’instancie via une classe template. J’ai donc indicativement:

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
Class B //une classe virtuelle
{
protected:
//variables
public:
virtual  Void do_work()=0;
};
 
Template <typename  implémentation "utile" de la classe
Class VeryB: public B
{
public:
VeryB() //constructeur par défaut
{}
 VeryB(_variables)
 {
 //affectations diverses
 }
 };
 
 class WorkingB: public VeryB<WorkingB>
 {
 WorkingB() //le constructeur vide
{}
 WorkingB(_variables)
 :VeryB<WorkingB>(_variables)
 {
 //affectations diverses
 }
 void do_work()
 {
 return;
 //un traitement
 }
 
 //recopie  
WorkingB(_variables)
 };
J'ai maintenant ma classe de mise en œuvre :
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
 class A()
 {
 private:
 //des variables
 //et :
 B* bObj;//A opèrera notamment sur un représentant de B
 public:
 A() //le constructeur vide
 {}
 A(paramètres)
 {
 bObj=new WorkingB(paramètres); //construction de la bonne instance (spécialisation) de B
 //etc
 }
 //ET MON PROBLEME, AU NIVAU DE LA RECOPIE;
 A(const &objToCopy)
 {
 //différentes recopies icis, mais pour le cas du pointeur sur classe abstraite B?
 //si B avait été une classe standard, j'aurais fait :
 bObj=new B(*objtocopy));
 }
 } ;
Je pensais faire une chose du genre (mais je sais que c’est faux écrit comme ça, c’est juste pour donner l’esprit):
bObj=new static_cast<VeryB>VeryB(*objtocopy>));

L’idée c’est donc que quand j’appelle le constructeur de copie de A, il retrouve le type de la classe implémentée pour B et qu’il me construise bObj à l’aide du pointeur sur le bon constructeur.

Est-ce que je suis sur une voie, voyez-vous une solution?
Merci