Composant générique et méthodes virtuelles
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:
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:
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:
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:
1 2 3 4
| generic::base1
generic::base2
generic::base3
generic::deriv |
alors que celle attendue devrait plutôt ressembler à:
Code:
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.