Corrispondenza della dichiarazione
Tutte le due dichiarazioni di funzione con lo stesso nome nello stesso ambito possono fare riferimento alla stessa funzione, o a due funzioni specifiche che sono sottoposte a overload.Se gli elenchi di argomenti delle dichiarazioni contengono gli argomenti dei tipi equivalenti (come descritto nella sezione precedente), le dichiarazioni di funzione puntano alla stessa funzione.In caso contrario, si riferiscono a due funzioni diverse selezionate utilizzando l'overload.
L'ambito di classe viene ottenuto rigorosamente; pertanto, una funzione dichiarata in una classe base non si trova nello stesso ambito di una funzione dichiarata in una classe derivata.Se una funzione in una classe derivata viene dichiarata con lo stesso nome di una funzione nella classe base, la funzione della classe derivata nasconde la funzione di classe base anziché causare l'overload.
L'ambito blocco viene ottenuto rigorosamente; pertanto, una funzione dichiarata in file non è incluso nello stesso ambito di una funzione ha dichiarato localmente.Se una funzione in locale dichiarata con lo stesso nome di una funzione dichiarata in file, la funzione in locale dichiarata nasconde la funzione di file-scoped anziché causare l'overload.Di seguito è riportato un esempio:
// 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" );
}
Il codice precedente mostra le due definizioni dalla funzione func.La definizione che accetta un argomento di tipo char * è locale per main a causa di extern istruzione.Di conseguenza, la definizione che accetta un argomento di tipo int è nascosto e la prima chiamata a func è per errore.
Per le funzioni membro di overload, le versioni diverse della funzione possono essere fornite i privilegi di accesso differenti.Ancora sono considerate nella classe interna e vengono pertanto funzioni sottoposte a overload.Si consideri il codice seguente, in cui la funzione membro Deposit viene sottoposto a overload; una versione è pubblica, l'altra, privato.
Lo scopo di questo esempio è quello di fornire Account classificare in cui una password corretta è necessario eseguire i depositi.Tale operazione viene eseguita utilizzando l'overload.
si noti che la chiamata a Deposit in Account::Deposit chiama la funzione membro privata.Questa chiamata corretta perché Account::Deposit è una funzione membro e pertanto ha accesso ai membri privati della classe.
// 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;
}