[C++] Overload & Heritage multiple

Overload & Heritage multiple [C++] - Programmation

Marsh Posté le 26-01-2002 à 19:56:16    

Une question un peu tordue :
 
class A  
{
  public : void f(int) {...}
};
 
class B
{
  public : void f(char *) { ... }
};
 
class C : public A, public B
{
};
 
void main()
{
  C unC;
  unC.f(5);
  unC.f("toto" );
}
 
Y'a-t-il un moyen quelquonque pour que les 2 versions de f soyent automatiquement injectes ds l'espace de nomage de C sans devoir passer par des  
 
using A::f;
using B::f;
 
ni  
 
void C::f(int arg) { A::f(arg); }
void C::f(char *arg) { B::f(arg); }
 
???
 
PS: je ne peux en aucun cas changer le nom de f dans A ou dans B

Reply

Marsh Posté le 26-01-2002 à 19:56:16   

Reply

Marsh Posté le 26-01-2002 à 20:46:23    

Les 2 fonctions n'ont pas la même signature donc pas de conflit.
Le compilo choisira la bonne fonction selon l'argument (il peut y a voir conflit si l'argument passé est d'aucun des types proposés)

 

[edtdd]--Message édité par Verdoux--[/edtdd]

Reply

Marsh Posté le 26-01-2002 à 21:09:56    

Je dis que des conneries moi :D
Tu peux essayer :

Code :
  1. class C : public A, public B
  2. {
  3. public:
  4.         void f(int i) { A::f(i);}
  5.         void f(char * c) {B::f(c);}
  6. };

Reply

Marsh Posté le 26-01-2002 à 21:54:55    

Hehe, au debut j'ai eu la meme reaction que toi Verdoux  
mais en fait je comprends pas trop pourquoi, aucun des compilos C++ n'accepte ce type de fonctionnalité.
 
Ta 2eme solution, c'est ce que j'ai fait (en plus simple, y'a ma premiere solution l'utilisation de using mais qui ne marche comme il faut qu'avec gcc)
 
J'ai posé la question, parce que je trouve ca pas bo donc je me demandais si y'a pas un truc de plus elegant. Pour le compilo y'a rien d'ambigu dans ce genre de code...

Reply

Marsh Posté le 27-01-2002 à 12:33:06    

selon Stroustrup(The c++ programing language third edition p.393)
 
le code pour ton prob est le suivant (et si un compilo ne le compile pas ou ne fais pas se kil faut c kil ne suit fort probablement pas bien la norme) :
 
class A  
{  
 public : void f(int) {...}  
};  
 
class B  
{  
 public : void f(char *) { ... }  
};  
 
class C : public A, public B  
{  
public :
using A::f;
using B::f;
};

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed