Bonjour à tous,

Je suis en train d'essayer de faire un composant générique avec lequel j'ai un petit soucis.

Voici le problème. Tout d'abord, il y a une série de petites classe de base destinée à être dérivées:

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
namespace generic
{
  struct base1 {
    base1(){}
    ~base1(){}
    virtual void func(void){cout << "generic::base1" << endl;}
  };
 
  struct base2 {
    base2(){}
    ~base2(){}
    virtual void func(void){cout << "generic::base2" << endl;}
  };
 
  struct base3 {
    base3(){}
    ~base3(){}
    virtual void func(void){cout << "generic::base3" << endl;}
  };
 
  struct deriv: virtual public base1,
                virtual public base2,
                virtual public base3 {
    deriv(){}
    ~deriv(){}
    virtual void func(void){cout << "generic::deriv" << endl;}
  };
}
Puis ensuite vient l'implémentation spécifique :

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
namespace custom
{
  struct base1: virtual public generic::base1 {
    base1(){}
    ~base1(){}
    virtual void func(void){cout << "custom::base1" << endl;}
  };
 
  struct base2: virtual public generic::base2 {
    base2(){}
    ~base2(){}
    virtual void func(void){cout << "custom::base2" << endl;}
  };
 
  struct base3: virtual public generic::base3 {
    base3(){}
    ~base3(){}
    virtual void func(void){cout << "custom::base3" << endl;}
  };
 
  struct deriv: virtual public generic::deriv,
                virtual public custom::base1,
                virtual public custom::base2,
                virtual public custom::base3 {
    deriv(){}
    ~deriv(){}
    virtual void func(void){cout << "custom::deriv" << endl;}
  };
}
Lors de l'utilisation ces classes, je ne parvient pas à appeler les fonctions membres souhaitées. Ainsi le programme suivant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
int main(int, char *[])
{
  int size=sizeof(custom::deriv);
 
  generic::deriv *ptr=new custom::deriv;
 
  ptr->base1::func();
  ptr->base2::func();
  ptr->base3::func();
  ptr->deriv::func();
 
  return 0;
}
génère la sortie:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
generic::base1
generic::base2
generic::base3
generic::deriv
alors que celle attendue devrait plutôt ressembler à:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
custom::base1
custom::base2
custom::base3
custom::deriv
J'aurais donc voulu savoir ce qui clochait dans ma conception ?

Merci d'avance.