成員函數的重載
主要特點是函數的參數類型和數目不同,與函數返回值類型沒有關係。重載和成員函數是否是虛函數無關。
特徵:
- 相同的範圍(在同一個類中)
- 相同的函數名字
- 不同的參數列表
- 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。
成員函數的隱藏
隱藏:派生類中的函數屏蔽了基類的同名函數。
- 兩個函數參數相同,但基類函數不是虛函數。(與覆蓋區別)
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
- 兩個函數參數不同,無論基類函數是否是虛函數,基類函數都會被屏蔽。(與重載區別)
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