讓我們通過一個例子來講解C++中的名字隱藏。在C++中,如果一個類裏有一個重載的方法, 你用另一個類去繼承它並重寫(覆蓋)那個方法。你必須重寫所有的重載方法, 否則未被重寫的方法會因爲名字相同而被隱藏,從而使它在派生類中不可見。
請看例子:
| class FirstClass{ public: virtual void MethodA(int); virtual void MethodA(int, int); }; void FirstClass::MethodA(int i){ cout<<"ONE"<<endl; } void FirstClass::MethodA(int i, int j){ cout<<"TWO"<<endl; } |
上面的類中有兩個方法(重載的方法),如果你想在派生類中重寫一個參數的函數, 你可以這麼做:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class
SecondClass
:
public
FirstClass{
public:
void
MethodA(int);
};
void
SecondClass::MethodA(int
i){
cout<<"THREE"<<endl;
}
int
main
(){
SecondClass
a;
a.MethodA(1);
a.MethodA(1,
1);
return
0;
}
|
上面的main函數中,第2個MethodA在編譯時會報錯,提示沒有與之匹配的函數。 這是因爲兩個參數的MethodA在派生類中是不可見的,這就是名字隱藏。
名字隱藏與虛函數無關。所以不管基類中那兩個函數是不是虛函數, 在這裏都會發生名字隱藏。解決方法有兩個。第一個是將2個參數的MethodA換一個名字, 那麼它在派生類中就可見了。但我們既然重載了MethodA,說明它們只是參數不同, 而實際上應該是在做相同或是相似的事的。所以換掉名字並不是個好辦法。因此, 我們一般採用第二種方法,在派生類中重寫所有的重載函數。
原文地址:http://www.cricode.com/757.html