(1)重載:函數名相同,函數的參數類型和個數不同,注意與函數的返回值類型無關,重載必須在同一個類中。
(2)重寫與覆蓋意義相同:在繼承和派生的時候纔可能出現,重寫(覆蓋)是指在派生類中存在重新定義的函數,其函數名、參數類型和數量必須與基類中的函數保持一致,只有函數體不同(即實現方式不同)。重寫的函數必須要有virtual關鍵字修飾,否則不能稱之爲重寫或者覆蓋。
(3)隱藏:隱藏也是隻有在繼承或者派生中才可能出現的情況,隱藏是指派生類的函數屏蔽了其基類的函數。注意只要派生類中的函數名與其基類中的函數名相同,基類函數將會被屏蔽。注意隱藏方法無法實現多態性。
舉例
class Base
{
public:
int add(int a, int b)
{
cout << "Base::add(int, int)" << endl;
return a+b;
}
double add(double a, double b) //重載
{
cout << "Base::add(double, double)" << endl;
return a+b;
}
virtual int sub(int a, int b)
{
cout << "Base::sub(int, int)" << endl;
return a-b;
}
};
class Derive : public Base
{
public:
int add() //隱藏了基函數中的add(int,int)和add(double,double),不具有多態性
{
cout << "Derive::add()" << endl;
return 10;
}
virtual int sub(int a, int b) //重寫(覆蓋)基函數中的sub(int,int),具有多態性
{
cout << "Derive::sub(int, int)" << endl;
return a-b;
}
};
int main()
{
Derive d;
Base *pb = &d;
Derive *fd = &d;
pb->add(10.0, 2.0); //Base::add(double, double),隱藏關係不具有多態性,因此無法訪問派生類中的函數
pb->add(10, 2); //Base::add(int, int),隱藏關係不具有多態性,因此無法訪問派生類中的函數中的函數
pb->sub(10,2); //Derive::sub(int, int),重寫(覆蓋)關係,可以訪問派生類中的函數
fd->add(); //Derive::add()
fd->sub(10,2); //Derive::sub(int, int)
system("pause");
return 0;
}
(1)Base類中的add(int, int)和add(double,double)是重載關係。
(2)Base類中的sub(int, int)和Derive類中的sub(int, int)是重寫關係,具有多態的特性。
(3)Base中的add(int, int)、add(double, double)和Derive類中的add()是隱藏關係,不具有多態性。