重載(overload)
重載函數(shù)是函數(shù)的一種特殊情況卿捎。
為方便使用洞斯,C++允許在同一范圍中聲明幾個功能類似的同名函數(shù),
但是這些同名函數(shù)的形式參數(shù)(指參數(shù)的個數(shù)显拜、類型或者順序)必須不同,也就是說用同一個運(yùn)算符完成不同的運(yùn)算功能爹袁。
這就是重載函數(shù)远荠。
重載函數(shù)常用來實(shí)現(xiàn)功能類似而所處理的數(shù)據(jù)類型不同的問題。
// overload
class H
{
public:
int add(int i, int j);
double add(double i, double j);
};
int H::add(int i, int j)
{
return i + j;
}
double H::add(double i, double j)
{
return i + j;
}
...
H h;
cout<<"h.add(2, 3) : "<<h.add(2, 3)<<endl;
cout<<"h.add(2.5, 3.0) : "<<h.add(2.5, 3.0)<<endl;
重定義(隱藏)
派生類的函數(shù)屏蔽了與其同名的基類函數(shù)失息。
注意只要同名函數(shù)譬淳,不管參數(shù)列表是否相同档址,基類函數(shù)都會被隱藏。
子類重新定義父類中有相同名稱的非虛函數(shù) ( 參數(shù)列表可以不同 ) 邻梆。
重定義后子類調(diào)用的函數(shù)是子類自己的函數(shù)守伸,父類的函數(shù)會被隱藏。名字隱藏特性浦妄。
如果想調(diào)用父類的該同名函數(shù)尼摹,需要用父類加上作用域來指定調(diào)用的函數(shù)。
class I
{
public:
int add(int i, int j);
};
int I::add(int i, int j)
{
int k = i + j;
cout<<"call I::add(int i, int j). result : "<<k<<endl;
return k;
}
>
class J : public I
{
public:
int add(int i, int j);
};
>
int J::add(int i, int j)
{
int k = i + j;
cout<<"call J::add(int i, int j). result : "<<k<<endl;
return k;
}
...
I i;
J j;
i.add(1, 2);
j.add(1, 2);
I *pi = &j;
pi->add(1, 2);
重寫(override)
派生類中存在重新定義的函數(shù)剂娄。
其函數(shù)名蠢涝,參數(shù)列表,返回值類型阅懦,所有都必須同基類中被重寫的函數(shù)一致和二。
只有函數(shù)體不同(花括號內(nèi)),派生類調(diào)用時會調(diào)用派生類的重寫函數(shù)耳胎,不會調(diào)用被重寫函數(shù)惯吕。
重寫的基類中被重寫的函數(shù)必須有virtual修飾。
// override
class K
{
public:
virtual int add(int i, int j);
};
int K::add(int i, int j)
{
int k = i + j;
cout<<"call K::add(int i, int j). result : "<<k<<endl;
return k;
}
class L : public K
{
public:
int add(int i, int j);
};
int L::add(int i, int j)
{
int k = i + j;
cout<<"call L::add(int i, int j). result : "<<k<<endl;
return k;
}
class M : public K
{
public:
int add(int i, int j);
};
int M::add(int i, int j)
{
int k = i + j;
cout<<"call M::add(int i, int j). result : "<<k<<endl;
return k;
}
...
K k;
K *pk = &k;
pk->add(1, 2);
L l;
pk = &l;
pk->add(1, 2);
M m;
pk = &m;
pk->add(1, 2);
References:
http://www.jb51.net/article/54225.htm
http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html
http://www.oschina.net/question/234345_48772