函數重載和覆蓋(重寫)的區別


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,類成員函數重載:局部同名函數將隱藏而不是重載全局聲明,不引入父類名字空間時子類的同名函數不會和父類的構成重載,靜態成員函數可以和非靜態成員函數構成重載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM