Udostępnij za pośrednictwem


Dopasowywanie deklaracji

Wszelkie deklaracje dwóch funkcji o tej samej nazwie w tym samym zakresie, mogą odwoływać się do tej samej funkcji lub do dwóch funkcji dyskretnych, które są przeciążone.Jeśli wykaz argumentów deklaracji zawiera równoważne typy argumentów (zgodnie z opisem w poprzedniej sekcji), deklaracje funkcji odnoszą się do tej samej funkcji.W przeciwnym razie, odnoszą się do dwóch różnych funkcji, które są wybrane za pomocą przeciążenia.

Zakres klasy jest ściśle przestrzegany; w związku z tym, funkcja zadeklarowana w klasie podstawowej nie jest w tym samym zakresie, co funkcja zadeklarowana w klasie pochodnej.Jeśli funkcja klasy pochodnej jest zadeklarowana z tą samą nazwą, jako funkcja w klasie podstawowej, funkcja klasy pochodnej ukrywa funkcje klasy podstawowej, zamiast powodować przeciążenie.

Zakres bloku jest ściśle przestrzegany; w związku z tym, funkcja zadeklarowana w zakresie pliku nie jest w tym samym zakresie, co funkcja zadeklarowana lokalnie.Jeśli funkcja zadeklarowana lokalnie ma taką samą nazwę, co funkcja zadeklarowana w zakresie pliku, funkcja zadeklarowana lokalnie ukrywa funkcje należącą do zakresu pliku, zamiast powodować 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" );
}

Poprzedni kod pokazuje dwie definicje funkcji func.Definicja, która wymaga argumentu typu char * jest lokalna dla main z powodu instrukcji extern.W związku z tym, definicja która przyjmuje argument typu int jest ukryta, a pierwsze wywołanie funkcji func jest błędne.

Dla przeciążonych elementów członkowskich funkcji, różne wersje funkcji, mogą mieć różne przywileje dostępu.Ale nadal uważa się, że znajdują się w zakresie otaczającym klasę, a więc funkcji przeciążonej.Rozważmy poniższy kod, w którym element członkowski funkcji Deposit jest przeciążony; jedna wersja jest publiczna, inne są prywatne.

Zamiarem tego przykładu jest dostarczenie klasy Account, w której wymagane jest poprawne hasło, aby wykonać depozyty.Jest to uzyskiwane za pomocą przeciążenia.

Należy zauważyć, że wywołanie Deposit w klasie Account::Deposit wywołuje prywatne elementy członkowskie funkcji.To wywołanie jest poprawne ponieważ Account::Deposit jest elementem członkowskim funkcji, a zatem ma dostęp do prywatnych elementów członkowskich 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