成員函數的重載、覆蓋和隱藏

成員函數的重載

主要特點是函數的參數類型和數目不同,與函數返回值類型沒有關係。重載和成員函數是否是虛函數無關。

特徵:

  • 相同的範圍(在同一個類中)
  • 相同的函數名字
  • 不同的參數列表
  • virtual關鍵字可有可無

實例:

class A
{
...
virtual int fun();
void fun(int);
void fun(double,double);
static int fun(char);
...
};

上述類中的4個fun函數都是重載關係。

成員函數的覆蓋

覆蓋:在派生類中覆蓋基類中的同名函數,要求基類函數必須是虛函數。

特徵:

  • 不同的範圍(分別位於基類和派生類中)
  • 相同的函數名字
  • 相同的參數
  • 相同的函數返回值
  • 基類函數必須有virtual關鍵字。

實例:

class S
{
    public:
        virtual void fun1(int ,int ){}

};
class B:public S
{
public:
    void fun1(int,int){}
};

上述代碼,B中fun1覆蓋了S中的fun1。

成員函數的隱藏

隱藏:派生類中的函數屏蔽了基類的同名函數。

  1. 兩個函數參數相同,但基類函數不是虛函數。(與覆蓋區別)
class A
{
public:
    void fun(int xp)
    {
        std::cout<<xp<<endl;
    }
};
class B:public A
{
public:
    void fun(int xp)
    {
    }
};


B b;
b.fun(2);  //則調用B中的函數fun
b.A::fun(2);  //則調用A中函數fun
  1. 兩個函數參數不同,無論基類函數是否是虛函數,基類函數都會被屏蔽。(與重載區別)
class A
{
public:
    void fun(int xp)
    {
        std::cout<<xp<<endl;
    }
};
class B:public A
{
public:
    void fun(char *xp)
    {
    }
};


B b;
b.fun(2);  //此語句錯誤,A中函數fun被隱藏,此時編譯器找不到參數int型的fun函數。
b.A::fun(2);  //可以使用此語句,調用A中函數fun
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章