轉載一篇文章:
http://www.cnblogs.com/ustc11wj/archive/2012/08/11/2637316.html
類的隱藏和重載不一樣
類的隱藏是指
一個類繼承自另外一個類,則父類中與子類名稱相同的函數將被隱藏,不管父類中這個函數重載了幾次,子類中將不再能夠使用它們。
更詳細的解釋是:
http://www.cnblogs.com/renyuan/archive/2013/06/08/3127562.html
1 重載與覆蓋
成員函數被重載的特征:
(1)相同的范圍(在同一個類中);
(2)函數名字相同;
(3)參數不同;
(4)virtual關鍵字可有可無。
覆蓋是指派生類函數覆蓋基類函數,特征是:
(1)不同的范圍(分別位於派生類與基類);
(2)函數名字相同;
(3)參數相同;
(4)基類函數必須有virtual關鍵字。
令人迷惑的隱藏規則
本來僅僅區別重載與覆蓋並不算困難,但是C++的隱藏規則使問題復雜性陡然增加。這里“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:
(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。
編程實驗:
#include <iostream> using namespace std; class A { public: void printfSth() { cout<<"A::printfsth()"<<endl; } void printfSth(string str) { cout<<"A::printfsth(string str):"<<str<<endl; } void printfSth(int i) { cout<<"A::virtual printfSth(int i):"<<i<<endl; } }; class C:public A { public: using A::printfSth; void printfSth(double i) { cout<<"C::printfSth(double i):"<<i<<endl; } }; int main() { C* c=new C(); c->printfSth(); c->printfSth(1); c->printfSth(1.1); delete c; }
這個時候就能夠有輸出,因為用了using關鍵字
還有另外一個用法
#include <iostream> using namespace std; class A { public: void printfSth() { cout<<"A::printfsth()"<<endl; } void printfSth(string str) { cout<<"A::printfsth(string str):"<<str<<endl; } void printfSth(int i) { cout<<"A::virtual printfSth(int i):"<<i<<endl; } }; class C:private A { public: using A::printfSth; }; int main() { C* c=new C(); c->printfSth(); c->printfSth(1); c->printfSth(1.1); delete c; }
這個時候還是能夠用A中方法。