Compartilhar via


Declaração de correspondência

Quaisquer declarações de dois função o mesmo nome no mesmo escopo podem referir-se para a mesma função, ou duas funções distintas que estão sobrecarregadas.Se o argumento lista de declarações de contenham argumentos de tipos equivalentes (conforme descrito na seção anterior), as declarações de função consultem a mesma função.Caso contrário, eles consultem duas funções diferentes que são selecionadas usando a sobrecarga.

Escopo de classe é observado estritamente; Portanto, uma função declarada na classe base não está no mesmo escopo como uma função declarada em uma classe derivada.Se uma função em uma classe derivada é declarada com o mesmo nome de uma função na classe base, a função de classe derivada oculta a função de classe base, em vez de causar sobrecarga.

Escopo de bloco é observado estritamente; Portanto, uma função declarada no escopo do arquivo não está declarado no mesmo escopo como uma função como localmente.Se uma função declarada localmente tiver o mesmo nome de uma função declarada no escopo do arquivo, a função declarada localmente oculta a função do escopo do arquivo em vez de causar sobrecarga.Por exemplo:

// 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" );
}

O código anterior mostra duas definições a partir da função func.A definição que leva um argumento do tipo char * é local para main devido a extern instrução.Portanto, a definição que leva um argumento do tipo int estiver oculta e a primeira chamada para func seja um erro.

Para funções membro sobrecarregadas, diferentes versões da função poderão ser concedidas privilégios de acesso diferentes.Eles ainda são considerados como estando no escopo da classe delimitador e, portanto, são funções sobrecarregadas.Considere o seguinte código, no qual a função de membro Deposit está sobrecarregado; uma versão é pública, outra, privada.

O objetivo deste exemplo é fornecer uma Account classe na qual é necessária uma senha correta para realizar depósitos.Isso é realizado usando a sobrecarga.

Observe que a chamada para Deposit na Account::Deposit chama a função de membro privado.Essa chamada é correta porque Account::Deposit é uma função de membro e, portanto, tem acesso aos membros particulares da 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;
}

Consulte também

Referência

Sobrecarga