Freigeben über


Deklarations-Abgleichen

Alle zwei Funktionsdeklarationen des gleichen Namens im gleichen Bereich können die gleiche Funktion oder zwei diskreten Funktionen verweisen, die überladen werden.Wenn die Argumentlisten der Deklarationen Argumente von entsprechenden Typen (wie im vorherigen Abschnitt beschrieben) enthalten, können die Funktionsdeklarationen die gleiche Funktion an.Andernfalls können sie zwei separate Funktionen an, die mithilfe des Überladens ausgewählt werden.

Klassengültigkeitsbereich wird ausschließlich beachtet. Deshalb ist eine Funktion, die in einer Basisklasse deklariert ist, nicht im selben Bereich wie ein Feature, das in einer abgeleiteten Klasse deklariert wird.Wenn eine Funktion in einer abgeleiteten Klasse mit dem gleichen Namen wie eine Funktion in der Basisklasse deklariert ist, wird die Funktion einer abgeleiteten Klasse die Basisklassenfunktion aus, anstatt Überladen zu verursachen.

Blockbereich wird ausschließlich beachtet. Deshalb ist eine Funktion, die im Dateigültigkeitsbereich deklariert ist, nicht im selben Bereich, den eine Funktion lokal deklariert wurde.Wenn eine lokal deklarierte Funktion den gleichen Namen wie eine Funktion, die im Dateigültigkeitsbereich deklariert wird, blendet die lokal deklarierte Funktion die FILE-bewertete Funktion aus, anstatt Überladen zu verursachen.Beispiele:

// declaration_matching1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void func( int i )
{
    cout << "Called file-scoped func : " << i << endl;
}

void func( char *sz )
{
   cout << "Called locally declared func : " << sz << endl;
}

int main()
{
   // Declare func local to main.
   extern void func( char *sz );

   func( 3 );   // C2664 Error. func( int ) is hidden.
   func( "s" );
}

Der vorhergehende Code werden zwei Definitionen von der Funktion funcan.Die Definition, die ein Argument des Typs char * akzeptiert, ist für main aufgrund der extern-Anweisung lokal.Daher wird die Definition, die ein Argument des Typs int akzeptiert, und der erste Aufruf von func ist fälschlicherweise ausgeblendet.

Für überladene Memberfunktionen können verschiedene Versionen der Funktion angegebene verschiedene Zugriffsprivilege sein.Sie werden weiterhin als im Kontext des einschließenden Klasse und sind somit überladenen Funktionen.Betrachten Sie den folgenden Code, in dem die Memberfunktion Deposit überladen wird. Version ist, die andere öffentlich, privat.

Der Zweck dieses Beispiels besteht darin, eine Account-Klasse bereitstellen, in der ein korrektes Kennwort erforderlich ist, Einzahlungen auszuführen.Dies ist unter Verwendung des Überladens erreicht.

Beachten Sie, dass der Aufruf von Deposit in Account::Deposit die private - Memberfunktion aufruft.Dieser Aufruf ist korrekt, da Account::Deposit eine Memberfunktion ist und daher Zugriff auf private Member der Klasse enthält.

// declaration_matching2.cpp
class Account
{
public:
   Account()
   {
   }
   double Deposit( double dAmount, char *szPassword );

private:
   double Deposit( double dAmount )
   {
      return 0.0;
   }
   int Validate( char *szPassword )
   {
      return 0;
   }

};

int main()
{
    // Allocate a new object of type Account.
    Account *pAcct = new Account;

    // Deposit $57.22. Error: calls a private function.
    // pAcct->Deposit( 57.22 );

    // Deposit $57.22 and supply a password. OK: calls a
    //  public function.
    pAcct->Deposit( 52.77, "pswd" );
}

double Account::Deposit( double dAmount, char *szPassword )
{
   if ( Validate( szPassword ) )
      return Deposit( dAmount );
   else
      return 0.0;
}

Siehe auch

Referenz

Überladen