Freigeben über


Deklarationsübereinstimmung

Zwei beliebige Funktionsdeklarationen des gleichen Namens im gleichen Bereich können auf die gleiche Funktion oder zwei einzelne Funktionen, die überladen werden, verweisen. Wenn die Argumentlisten der Deklarationen Argumente äquivalenter Typen enthalten (wie im vorherigen Abschnitt beschrieben), beziehen sich die Funktionsdeklarationen auf die gleiche Funktion. Andernfalls beziehen sie sich auf zwei separate Funktionen, die mithilfe des Überladens ausgewählt werden.

Der Klassenbereich wird strikt beachtet. Deshalb befindet sich eine Funktion, die in einer Basisklasse deklariert wurde, nicht im selben Bereich wie eine Funktion, die in einer abgeleiteten Klasse deklariert wurde. Wenn eine Funktion in einer abgeleiteten Klasse mit dem gleichen Namen wie eine Funktion in der Basisklasse deklariert ist, blendet die Funktion der abgeleiteten Klasse die Basisklassenfunktion aus, und es erfolgt keine Überladung.

Der Blockbereich wird strikt beachtet. Deshalb befindet sich eine Funktion, die im Dateibereich deklariert ist, nicht im selben Bereich wie eine lokal deklarierte Funktion. Wenn eine lokal deklarierte Funktion den gleichen Namen wie eine Funktion besitzt, die im Dateibereich deklariert wird, blendet die lokal deklarierte Funktion die Funktion im Dateibereich aus, und es erfolgt keine Überladung. Beispiel:

// 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 zeigt zwei Definitionen der Funktion func. Die Definition, die ein Argument vom Typ char * akzeptiert, ist gegenüber main aufgrund der extern-Anweisung lokal vorhanden. Daher wird die Definition, die ein Argument vom Typ int akzeptiert, ausgeblendet, und der erste Aufruf von func ist fehlerhaft.

Für überladene Memberfunktionen können verschiedenen Versionen der Funktion unterschiedliche Zugriffsrechte zugewiesen werden. Sie werden weiterhin als im Gültigkeitsbereich der einschließenden Klasse betrachtet und sind somit überladene Funktionen. Betrachten Sie den folgenden Code, in dem die Memberfunktion Deposit überladen wird. Eine Version ist öffentlich, die andere privat.

Der Zweck dieses Beispiels ist es, eine Account-Klasse bereitzustellen, in der ein korrektes Kennwort erforderlich ist, um Eingaben vorzunehmen. Dies wird mithilfe der Überladung 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 hat.

// 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