宣告對應
同一個範圍中任何兩個相同名稱的函式宣告可以參考同一個函式,也可以參考兩個多載的個別函式。 如果宣告的引數清單包含相同類型的引數 (如先前章節所述),函式宣告會參考相同的函式。 否則,它們會參考使用多載選取的兩個不同函式。
類別範圍會受到嚴密的觀察;因此,在基底類別中宣告的函式和在衍生類別中宣告的函式不在同一個範圍內。 如果將衍生類別中的函式宣告為與基底類別中的函式相同名稱,該衍生類別函式會隱藏基底類別函式,而不會引發多載。
區塊範圍會受到嚴密的觀察;因此,在檔案範圍中宣告的函式和在本機宣告的函式不在同一個範圍內。 如果本機宣告的函式與在檔案範圍中宣告的函式相同名稱,本機宣告的函式會隱藏檔案範圍涵式,而不會引發多載。 例如:
// 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" );
}
上述程式碼會顯示函式 func 的兩個定義。 因為 extern 陳述式的緣故,採用類型為 char * 之引數的定義對 main 是本機定義。 因此會隱藏採用類型為 int 之引數的定義,而對 func 的第一個呼叫會出現錯誤。
對於多載成員函式,可以將不同的存取權限授與不同版本的函式。 這些函式仍在封入類別的範圍內,因此是多載函式。 請考慮下列程式碼,其中的成員函式 Deposit 是多載函式;其中一個是公用版本,另一個則是私用版本。
這個範例的目的在於提供 Account 類別,在此類別中需要有正確的密碼才能執行儲放。 此作業需使用多載來完成。
請注意,呼叫 Account::Deposit 中的 Deposit 會呼叫私用成員函式。 這個呼叫是正確的,因為 Account::Deposit 是成員函式,因此可以存取該類別的私用成員。
// 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;
}