重載、隱藏、覆蓋

一、       重載

重載包括函數的重載和運算符的重載。函數重載是指在同一個作用域中,相同函數名字,不同參數或參數個數不同的函數可以實現重載。

二、隱藏

隱藏包括變量和函數的隱藏。函數的隱藏是指在不同作用域中,函數被下一級作用域中的同名函數隱藏,可以不具備相同的函數參數或參數個數。因爲調用成員函數式要經過以下3步:

1、  編譯器查找函數名

2、  從同名候選者中選擇最佳匹配函數

3、  檢查是否具有訪問最佳匹配函數的權限

三、覆蓋

覆蓋是指派生類函數覆蓋基類函數,即:函數位於不同的範圍,函數名字相同,參數相同,基類函數必須有virtual關鍵字。如下例中:

#include <iostream>

using namespace std;

class base
{
    public:
    void func(int)
    {
        cout<<"base::func(int)"<<endl;
        }
    void func(int, int )
    {
        cout<<"base::func(int,int)<<endl";
    }
};
class derived: public base
{
public:
B::func(int,int); //聲明作用域後,後面的錯誤就不會出現了;//並且輸出base::func(int,int)
    void func(int)
    {
        cout<<"derived::func(int)"<<endl;
        }
    };
int main()
{
derived D;
base B;
B.func(1); //重載,輸出base::func(int)
B.func(1,1); //重載,輸出base::func(int,int)
    D.func(1,1); // 錯誤,因爲派生類中的func隱藏了基類的所//有同名函數(包括重載)
    D.func(1); //輸出 derived::func(int)
    return 0;
}

如果想實現派生類可以調用基類被隱藏的函數,可以使用表明作用域的方式實現。

 

 

對於覆蓋,即多態的形式:
#include <iostream>

using namespace std;

class base
{
    public:
    virtual void func(int)
    {
        cout<<"base::func(int)"<<endl;
        }
    virtual void func(int, int )
    {
        cout<<"base::func(int,int)"<<endl;
    }
};
class derived: public base
{
    public:
    void func(int)
    {
        cout<<"derived::func(int)"<<endl;
        }
    };
int main()
{
    derived D;
    base &b = D;
    b.func(1,1); //輸出base::func(int,int)
    b.func(1);  //輸出 derived::func(int)
    return 0;
    }


 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章