1、重載:函數重載是指在同一作用域內(名字空間),可以有一組具有相同函數名,不同參數列表的函數;
2、覆蓋(也叫重寫):指在派生類中重新對基類中的虛函數(注意是虛函數)重新實現。即函數名和參數都一樣,只是函數的實現體不一樣;
3、隱藏:指派生類中的函數把基類中相同名字的函數屏蔽掉了,隱藏與另外兩個概念表面上看來很像,很難區分,其實他們的關鍵區別就是在多態的實現上。
下面那種情形下myfunc函數聲明是重載? A. namespace IBM { int myfunc(int a); } namespace SUN { int myfunc(double b); } B. namespace IBM { int myfunc(int a); } namespace SUN { using IBM::myfunc; int myfunc(double b); } C. namespace IBM { int myfunc(int a); namespace SUN { int myfunc(double b); } } D. class A { public: int myfunc(int a); } class SubA: public A { public: int myfunc(double b); }
答案是B,A和C都是名字空間不同;D是隱藏,只有B是重載!
存在如下聲明: void f (); //全局函數 class A { public: void f(int); }; class B: public A { public: void f(int *); static void f(int **); void test(); //... }; 那么在如下B::test實現中哪幾個函數調用是合法的: void B::test() { int x = 0; int *p = NULL; f(); //(1) f(x); //(2) f(&x); //(3) f(&p); //(4) }; A.(1)(2)(3)(4) B.(1)(3)(4) C.(2)(3)(4) D.(3)(4)
答案是D,類成員函數重載:局部同名函數將隱藏而不是重載全局聲明,不引入父類名字空間時子類的同名函數不會和父類的構成重載,靜態成員函數可以和非靜態成員函數構成重載。