Partager via


Correspondance de déclaration

Deux déclarations de fonction quelconques du même nom dans la même portée peuvent faire référence à la même fonction, ou à deux fonctions discrètes qui sont surchargées.Si les listes d'arguments des déclarations contiennent des arguments des types équivalents (comme décrit dans la section précédente), les déclarations de fonctions font référence à la même fonction.Sinon, elles font référence à deux fonctions différentes qui sont sélectionnées à l'aide de la surcharge.

la portée de classe est strictement observée ; par conséquent, une fonction déclarée dans une classe de base n'est pas dans la même portée qu'une fonction déclarée dans une classe dérivée.Si une fonction dans une classe dérivée est déclarée avec le même nom qu'une fonction dans la classe de base, la fonction de classe dérivée occulte la fonction de classe de base au lieu de provoquer la surcharge.

la portée de bloc est strictement observée ; par conséquent, une fonction déclarée dans la portée du fichier n'est pas dans la même portée qu'une fonction a déclaré localement.Si une fonction localement déclaré possède le même nom qu'une fonction déclarée dans la portée du fichier, la fonction locale déclarée masque la fonction de fichier-scoped au lieu de provoquer la surcharge.Par exemple :

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

Le code précédent affiche deux définitions de la fonction func.la définition qui prend un argument de type char * est locale à main en raison de l'instruction d' extern .Par conséquent, la définition qui prend un argument de type int est masquée, et le premier appel à func est dans l'erreur.

Pour les fonctions membres surchargées, différentes versions de la fonction peuvent être données des privilèges d'accès.Ils sont encore pris en compte dans la portée de la classe englobante et sont donc les fonctions surchargées.Prenons le code suivant, dans lequel la fonction membre Deposit est surchargée ; une version est publique, l'autre, privé.

l'intention de cet exemple est de fournir une classe d' Account dans laquelle un mot de passe correct est requis pour effectuer des dépôts.Cela est accompli en utilisant la surcharge.

notez que l'appel à Deposit dans Account::Deposit appelle la fonction membre privée.Cet appel est correct parce qu' Account::Deposit est une fonction membre et a par conséquent accès aux membres privés de la 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;
}

Voir aussi

Référence

Surcharge