C++ Kurs

Überladen von Funktionen/Memberfunktionen

Die Themen:

Einführung

War es bisher immer so, dass der Name einer Funktion oder Memberfunktion eindeutig sein musste, so werden wir diese Einschränkung nun etwas aufweichen. Unter C++ ist es möglich, unter gewissen Randbedingungen mehrere Funktionen oder auch Memberfunktionen mit dem gleichem Namen zu definieren. Diese 'Mehrfach-Definition' werden auch als Überladen bezeichnet.

HinweisWenn im Folgenden von Memberfunktionen die Rede ist, so sind damit auch stets Funktionen gemeint.

Wenn nun aber mehrere Memberfunktionen den gleichen Namen haben, so müssen diese sich irgendwie unterscheiden, damit beim Aufruf der Memberfunktion erkannt werden kann, welche Memberfunktion aufgerufen werden soll. Dazu müssen sich die Signaturen der Memberfunktionen in mindestens einem der folgenden Punkte unterscheiden:

1. Die Memberfunktionen besitzen eine unterschiedliche Anzahl von Parameter.

PgmHeaderclass Window
{
    void SetData();
    void SetData(char*);
    void SetData(char*, int);
    ....
};

2. Die Datentypen der Parameter sind unterschiedlich.

PgmHeaderclass Window
{
    void SetData(char*);
    void SetData(ifstream&);
    ....
};

Obacht gegeben werden muss, wenn auf const correctness Wert gelegt wird. Beim Überladen wird der const-Qualifizierer bei den Parametern nicht mit ausgewertet.

PgmHeaderclass Window
{
    void SetData(int);
    void SetData(const int);  // FEHLER!
    ....
};

Sehen wir uns noch ein Beispiel für das Überladen von Funktionen an. Die beiden Funktionen Swap(...) dienen zum Vertauschen von zwei Werten, wobei die erste Funktion zwei short-Werte vertauscht und die zweite Funktion zwei double-Werte.

PgmHeader// Vertauscht zwei short-Werte
void Swap (short& v1, short& v2);
// Vertauscht zwei double-Werte
void Swap (double& v1, double& v2);
HinweisAchten sie beim Aufruf von überladenen Memberfunktionen stets darauf, dass eindeutig ist welche Memberfunktion aufgerufen werden soll. So würde zum Beispiel der nachfolgende Aufruf der Swap(...) Funktion einen Übersetzungsfehler liefern!
short sVar;
double dVar;
...
Swap (sVar, dVar);
AchtungAber Achtung! Besitzen die überladenen Memberfunktionen Default-Parameter, so müssen diese sich in mindestens in einem Parameter vor dem Default-Parameter unterscheiden. Nur dann ist beim Aufruf der Memberfunktion eindeutig welche Memberfunktion ausgeführt werden soll. Überlegen Sie sich einmal, warum dies so ist.

deleted functions

Sollen beim Überladen von Funktionen Funktionsaufrufe durch implizite Typkonvertierung von Parametern verhindert werden, so können dafür sogenannte deleted functions deklariert werden. Sehen wir uns dies am besten anhand eines einfachen Beispiels an:

PgmHeader// Funktionsdefinition
void DoAnything (short val)
{
   ...
}

int main()
{
   short sVal = 10;
   long  lVal = 1234567L;
   DoAnything(sVal);     // Aufruf mit short-Argument
   DoAnything(lVal);     // Aufruf mit long-Argument
   ...
}

Die Funktion DoAnything() erwartet als Parameter einen short Wert. Wird diese Funktion nun z.B. mit einem mit einem long Wert aufgerufen, so erfolgt eine automatische Typkonvertierung des long Werts in einen short Wert, was zu einem völlig falschen Wert führen kann. Um eine solche automatische Typkonvertierung beim Aufruf von Funktionen und Memberfunktionen zu verhindern, wird eine entsprechende Funktion als deleted function deklariert, so wie nachfolgend dargestellt.

PgmHeader// Funktionsdefinition
void DoAnything (short val)
{
   ...
}
// Deklaration einer deleted function
void DoAnything (long) = delete;

int main()
{
   short sVal = 10;
   long  lVal = 1234567L;
   DoAnything(sVal);     // Aufruf mit short-Parameter
   DoAnything(lVal);     // Führt jetzt zum Fehler beim Übersetzen
   DoAnything(10);       // Auch das erzeugt einen Fehler beim Uebersetzen
   ...
}

Und auch der 3. Aufruf der Funktion führt jetzt zu einem Übersetzungsfehler, da dieser Funktionsaufruf nicht eindeutig ist. Ein int Wert kann ja implizit sowohl in einen short als auch in einen long konvertiert werden und der Aufruf mit einem long Parameter wurde explizit unterbunden.

Beispiel zum Überladen

Sehen wir uns noch einige weitere Beispiele zum Überladen von Memberfunktionen an:

PgmHeaderclass Window
{
    ....
 public:
    // Ausgangs-Memberfunktion
    void SetData(char*);
    // Fall 1
    int  SetData(char*);
    // Fall 2
    void SetData(char*, int nP=1);
    // Fall 3
    void SetData(char*, char*, int nP=1);
};

1. Fall:
Nicht zulässig, da sich die Memberfunktion nur im Returntyp von der Ausgangs-Memberfunktion unterscheidet.

2. Fall:
Auch dieser Fall ist unzulässig, da beim Aufruf der Memberfunktion das zweite Argument (Default-Parameter) entfallen kann und sich der Aufruf damit nicht vom Aufruf der Ausgangs-Memberfunktion unterscheidet.

3. Fall:
Zulässiger Fall, da die Memberfunktion mit mindestens zwei Argumenten aufgerufen werden muss.

Beispiel und ÜbungUnd hier geht's zum Beispiel und zur Übung.