重载(overload)
重载函数是函数的一种特殊情况。
为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,
但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。
这就是重载函数。
重载函数常用来实现功能类似而所处理的数据类型不同的问题。
// 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;
重定义(隐藏)
派生类的函数屏蔽了与其同名的基类函数。
注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。
子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。
重定义后子类调用的函数是子类自己的函数,父类的函数会被隐藏。名字隐藏特性。
如果想调用父类的该同名函数,需要用父类加上作用域来指定调用的函数。
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)
派生类中存在重新定义的函数。
其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。
只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。
重写的基类中被重写的函数必须有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