2010-12-07 4 views
0

Créez une fonction pouvant avoir une liste d'arguments différente.
quelque chose comme çaComment créer une fonction avec des options d'arguments?

void s(int d, double t); 
void s(string d, UNIT e); 

merci à l'avance.
Edit 2:
D'accord, quand je l'essayer avec ma classe ça ne fonctionne pas ...
ici est ma classe de base

class GUIInterface 
{ 
public: 
    ..... 
    virtual void LoadFile(string fileName) = 0; 
    virtual void LoadFile(LPCWSTR fileName) = 0; 
     .... 
}; 

Je reçois cette erreur.

error C2259: 'GUIButtons' : cannot instantiate abstract class 
1>   due to following members: 
1>   'void GUIInterface::LoadFile(LPCWSTR)' : is abstract 

Bon, dans mes GUIButtons i remplacer les virtual void LoadFile(string fileName) = 0; mais je ne l'emporte pas sur le second.
comme celui-ci

class GUIButtons : public GUIInterface 
{ 
    ..... 
    void LoadFile(string fileName) { ... } 
    ... 
} 
+1

Cela me semble bien. C++ permet la définition multiple de la fonction s tant que chacun a un ensemble unique de paramètres. –

+0

Oh oublié d'inclure quelque chose dans mon post, que diriez-vous si les fonctions sont virtuelles et en classe – Ramilol

+0

@Ramhol - Qu'en est-il? –

Répondre

4

surchargement de fonction est parfaitement légal en C++, tant que les paramètres peuvent produire une résolution unique. Dans le cas ci-dessus, le premier paramètre sera toujours suffisant pour résoudre uniquement l'une des fonctions.

Dans un contexte de classe, si les fonctions membres sont définies dans la même classe, cela fonctionne exactement comme pour les fonctions libres.

Le seul scénario qui attire de nombreuses C++ novices est avec l'héritage:

class Foo { 
public: 
    void s(int d, double t); 
}; 

class Bar { 
public: 
    void s(string d, UNIT e); 
}; 

// ... 

Bar b; 
b.s("hello", 42); // Fine 
b.s(3, 4.5);  // FAIL 

Le deuxième appel tp b.s ne fonctionnera pas, parce que C++ semble pour la première portée qui contient le symbole. Dans ce cas, il trouve Bar::s, et même si Bar::s(string, UNIT) échoue la correspondance, C++ n'ira pas essayer la classe de base. Une fois qu'une portée avec le symbole est trouvée, la recherche s'arrête là et ensuite, indépendamment du fait qu'une fonction correspondante soit trouvée à ce point.

Vous pouvez contourner ce problème en explicitement réintroduisant le symbole de la classe de base dans la classe dérivée:

class Bar { 
public: 
    using Foo::s; 
    void s(string d, UNIT e); 
}; 

EDIT: En réponse à Edit 2 ...

de l'OP Le problème que vous les voir n'a rien à voir avec la surcharge. Vous n'avez pas surchargé le membre virtuel pur fonctionne dans la classe dérivée GUIButtons. Le remplacement d'une fonction de classe de base par une fonction de classe dérivée correspondante est un concept différent de la surcharge.

Questions connexes