C++中函数重载、覆盖与隐藏的区别

来源:互联网 发布:后缀表达式c语言算法 编辑:程序博客网 时间:2024/05/17 20:09

重载(overload):指函数有不同的参数表,对同名函数的名称做修饰,然后这些同名函数就构成了不同的函数。在同一可访问区域内被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,程序会根据不同的参数列表来确定调用哪个函数。对于重载函数的调用,在编译期间就已经确定,是静态的,它们的地址在编译期间就绑定了与多态无关。另外,重载不关心函数的返回类型。

1) int test(int a);

2) int test(int a, int b);

3) float test(int a);

上面的例子中,1)和2)是重载关系,2)和3)是重载关系,但是1)和3)不是重载关系,因为它们参数完全相同。

成员函数被重载的特征归纳如下:

1) 相同的范围(同一个类中)

2) 函数名字相同

3) 参数不同(类型,个数,顺序)

4) virtual关键字可有可无

覆盖(override):是指派生类中存在重新定义基类的虚函数,其函数名,参数列表,返回值类型必须同父类中被覆盖的函数严格一致。派生类中的覆盖函数和基类中的被覆盖函数只是函数体不同。当子类重新定义了父类的虚函数后,父类指针根据赋给它的的不同的子类指针,动态的调用属于子类的虚函数,这样的调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,虚函数的地址是在运行期间绑定的。

覆盖的特征总结如下:

1)基类函数必须有virtual关键字

2)函数名字相同

3)有完全相同的参数

4)不同的范围(分别位于基类和派生类)

隐藏/屏蔽(hide):指派生类的函数屏蔽了与其同名的基类函数。其规则如下:

1)必须分别位于派生类和基类中

2)必须同名

3)如果派生类的函数与基类的函数同名,但是参数不同,则无论有无virtual关键字,基类的函数都将被隐藏。

4)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual,此时基类的函数被隐藏。(如果有virtual就是函数覆盖了)

隐藏一词可以这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了那么就停止查找了,所以如果一个派生类和一个基类都有同一个同名(暂且不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那么我们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义.