天天看點

C++中的重載、覆寫(重寫)和隐藏

類中成員函數被重載的特征:

1、相同的作用域(同一個類中);

2、函數名字相同;

3、參數不同;

4、virtual關鍵字可有可無。

覆寫是指派生類函數覆寫基類函數,特征是:

1、不同的作用域(基類和派生類);

2、函數名字相同;

3、參數相同;

4、基類函數必須有virtual關鍵字。

隐藏指派生類函數屏蔽了與其同名的基類函數,特征是:

1、如果派生類的函數與基類的函數同名,但是參數不同,不論有無virtual關鍵字,基類的函數将被隐藏。(注意不能與重載混淆)

2、如果派生類的函數與基類的函數同名,參數也相同,基類函數沒有virtual關鍵字,基類的函數将被隐藏。(注意不能與覆寫混淆)

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Base
{
public:
    virtual void test(float x)
    {
        cout << "Base::test(float) " << x << endl;
    }
    void test1(float x)
    {
        cout << "Base::test1(float) " << x << endl;
    }
    void test2(float x)
    {
        cout << "Base::test2(float) " << x << endl;
    }
    // 函數Base::test2(int)重載了Base::test2(float),函數名相同,參數不同,在同一個類中(同一作用域),故為重載
    void test2(int x)
    {
        cout << "Base::test2(int)" << x << endl;
    }
};
class Derived :public Base
{
public:
    // 函數Derived::test(float)覆寫了Base::test(float),函數名相同,參數相同,且有virtual關鍵字,故為覆寫
    virtual void test(float x)
    {
        cout << "Derived::test(float) " << x << endl;
    }
    //函數Derived::test1(float)隐藏了Base::test1(float),函數名相同,參數相同,但沒有virtual關鍵字,故為隐藏,而不是覆寫
    void test1(float x)
    {
        cout << "Derived::test(float) " << x << endl;
    }
    //函數Derived::test2(int)隐藏了Base::test2(float),函數名相同,參數不同,但沒有在同一個類中(同一作用域),故為隐藏,而不是重載
    void test2(int x)
    {
        cout << "Derived::test(int) " << x << endl;
    }
};
void Funtest()
{ 
    Derived d;
    Base *pb = &d;
    Derived *pd = &d;
    /*pb->test(1.02f);
    pd->test(1.02f);*/
    /*pb->test1(1.02f);
    pd->test1(1.02f);*/
    /*pb->test2(1.02f);
    pd->test2(3);*/
    pb->test2();
    pb->test2();
}
int main()
{
    Funtest();
    system("pause");
    return ;
}
           

函數Derived::test(float)覆寫了Base::test(float),運作結果如下:

C++中的重載、覆寫(重寫)和隐藏

函數Derived::test1(float)隐藏了Base::test1(float),運作結果如下:

C++中的重載、覆寫(重寫)和隐藏

函數Derived::test2(int)隐藏了Base::test2(float),運作結果如下:

C++中的重載、覆寫(重寫)和隐藏

函數Base::test2(int)重載了Base::test2(float),運作結果如下:

C++中的重載、覆寫(重寫)和隐藏