Udostępnij za pośrednictwem


Deklaracja dopasowania

Wszelkie deklaracje dwóch funkcji o tej samej nazwie w tym samym zakresie można się odwoływać do tej samej funkcji lub dwie funkcje dyskretnych, które są przeciążone.Jeśli argument list deklaracje zawiera argumenty typów równoważne (jak opisano w poprzedniej sekcji), deklaracji funkcji, które odnoszą się do tej samej funkcji.W przeciwnym razie odnoszą się do dwóch różnych funkcji wybranych za pomocą przeciążenie.

Zakres klasy jest ściśle przestrzegane; w związku z tym funkcja zadeklarowana w klasie bazowej nie jest w tym samym zakresie, jako funkcja zadeklarowana w klasie pochodnej.Z taką samą nazwę jak funkcji w klasie bazowej zadeklarowana funkcji w klasie pochodnej, funkcja klasy pochodzące ukrywa funkcji klasa bazowa zamiast powodując przeciążenie.

Zablokuj zakres jest ściśle przestrzegane; w związku z tym funkcja zadeklarowana w zakresie pliku nie jest w tym samym zakresie, jako funkcja zadeklarowana lokalnie.Jeśli lokalnie zadeklarowanej funkcji ma taką samą nazwę jak funkcja zadeklarowana w zakresie pliku, lokalnie zadeklarowanej funkcji ukrywa funkcji zakresu pliku zamiast powodując przeciążenie.Na przykład:

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

Powyższy kod zawiera dwie definicje od funkcji func.Definicja, która przyjmuje argument typu char * jest lokalny do main z powodu extern instrukcji.Dlatego definicja przyjmuje argument typu int jest ukryty, a pierwsze wywołanie func w błąd.

Dla funkcji zastąpionej elementów członkowskich różne wersje funkcji mogą być podawane w różne przywileje dostępu.One nadal uważane są za w zakresie otaczający klasy i są zatem funkcji zastąpionej.Rozważmy poniższy kod, w którym funkcja Członkowskie Deposit jest nadmiernie obciążony; jedna wersja jest publiczne, inne, prywatnego.

Zamiarem próbka ta jest zapewnienie Account klasy, w którym poprawnego hasła są wymagane do wykonania depozyty.Można to osiągnąć przy użyciu przeciążenie.

Należy zauważyć, że wywołanie Deposit w Account::Deposit wywołuje funkcję Członkowskie prywatnego.To wywołanie jest poprawna ponieważ Account::Deposit jest funkcją Członkowskie i dlatego ma dostęp do członków prywatnych klasy.

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

Zobacz też

Informacje

Przeciążenie