2010-12-07 7 views
0

Erstellen Sie eine Funktion, die verschiedene Argumentliste haben kann.
so etwas wie dieserWie erstellt man eine Funktion mit Optionen von Argumenten?

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

Dank im Voraus.
Edit 2:
Okay, wenn ich es mit meiner Klasse versuchen, funktioniert es nicht ...
hier ist meine Basisklasse

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

ich diesen Fehler.

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

Okay, in meinem GUIButtons außer Kraft setzen i die virtual void LoadFile(string fileName) = 0; aber ich überschreiben nicht die zweite.
wie diese Überlastung

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

Sieht gut für mich aus. C++ erlaubt eine mehrfache Definition der Funktion s, solange jede einen eindeutigen Satz von Parametern aufweist. –

+0

Oh vergessen, etwas in meinen Beitrag aufzunehmen, wie wäre es, wenn die Funktionen virtuell sind und in der Klasse – Ramilol

+0

@Ramhol - Was ist damit? –

Antwort

4

Funktion ist völlig legal in C++, solange die Parameter eine eindeutige Auflösung erzeugen kann. Im obigen Fall wird der erste Parameter immer ausreichen, um eindeutig auf eine der Funktionen zu reagieren.

Wenn in einem Klassenkontext die Elementfunktionen in derselben Klasse definiert sind, funktioniert sie genauso wie für freie Funktionen.

Das einzige Szenario, das viele C++ Anfänger fängt heraus ist mit Vererbung:

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 

Der zweite Aufruf tp b.s wird nicht funktionieren, weil C++ für den ersten Rahmen sieht, die das Symbol enthält. In diesem Fall findet es Bar::s, und obwohl Bar::s(string, UNIT) die Übereinstimmung fehlschlägt, wird C++ nicht gehen und die Basisklasse versuchen. Sobald ein Bereich mit dem Symbol gefunden wurde, stoppt die Suche dort und unabhängig davon, ob zu diesem Zeitpunkt eine passende Funktion gefunden wurde.

Sie können um dieses Verhalten zu erhalten, indem explizit die Basisklasse Symbol in der abgeleiteten Klasse wieder einzuführen:

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

EDIT: Als Reaktion auf die Bearbeiten des OP 2 ...

Das Problem, das Sie Sehen hat nichts mit Überlastung zu tun. Sie haben einfach nicht die reinen virtuellen Member-Funktionen in der abgeleiteten Klasse GUIButtons überschrieben. Das Überschreiben einer Basisklassenfunktion mit einer passenden abgeleiteten Klassenfunktion ist ein anderes Konzept als das Überladen.

Verwandte Themen