一、 重載
重載包括函數的重載和運算符的重載。函數重載是指在同一個作用域中,相同函數名字,不同參數或參數個數不同的函數可以實現重載。
二、隱藏
隱藏包括變量和函數的隱藏。函數的隱藏是指在不同作用域中,函數被下一級作用域中的同名函數隱藏,可以不具備相同的函數參數或參數個數。因爲調用成員函數式要經過以下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;
}