c++重載、覆蓋和隱藏

       c++成員函數的重載、覆蓋和隱藏很容易混淆,所以咱們必須搞清楚這一點。ios

1.重載

       重載特色:同一訪問區域(同類)、函數名稱相同、函數參數不一樣(不關心返回類型)、virtual關鍵字無關緊要c++

       代碼示例:函數

class OverLoad
{
public:
    void test() {}
    void test(int i) {}
    void test(float i) {}
    void test(int i, float j) {}
};

2.覆蓋

        覆蓋是指派生類函數覆蓋基類函數,特色是:不一樣訪問區域(不一樣類)、函數名稱相同 、參數相同、基類函數必須有virtual關鍵字spa

3.隱藏

       隱藏規則:3d

      1) 若是派生類的函數與基類的函數同名,可是參數不一樣。此時,不論有無virtual關鍵字,基類的函數將被隱藏。 code

       2) 若是派生類的函數與基類的函數同名,而且參數也相同,可是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏。 blog

4.代碼示例

#include <iostream>
using namespace std;

class OverLoad
{
public:
    void test() {}
    void test(int i) {}
    void test(float i) {}
    void test(int i, float j) {}
};

class Base
{
public:
    virtual void A(int i) 
    {
        cout << "Base::A()" << endl;
    }

    void B(int i)
    {
        cout << "Base::B()" << endl;
    }

    void C(int i)
    {
        cout << "Base::C()" << endl;
    }

    void D()
    {
        cout << "Base::D()" << endl;
    }
};

class Derive : public Base
{
public:
    //覆蓋父類的A  函數名、參數徹底相同,且父類要有virtual,子類virtual無關緊要
    virtual void A(int i)
    {
        cout << "Derive::A()" << endl;
    }
    
    //隱藏父類中的B 函數名、參數徹底相同,父類無virtual
    void B(int i)
    {
        cout << "Derive::B()" << endl;
    }

    //隱藏父類中的C 函數名相同、參數不一樣,與virtual無關
    void C(char* str)
    {
        cout << "Derive::C()" << endl;
    }
};

int main()
{
    Derive* d = new Derive;
    Base* b = d;
    //均調用父類中的A
    d->A(1);
    b->A(2);
    //分別調用本身的B
    d->B(1);
    b->B(1);
    //分別調用本身的C
    d->C("1");
    b->C(1);
    d->D();//未被隱藏能夠調用D()
    //d->C(1);因爲隱藏了父類中的void C(int i),因此不能再調用
}

image

相關文章
相關標籤/搜索