c++ 中重载 覆盖 隐藏

来源:互联网 发布:c语言如何编写手机程序 编辑:程序博客网 时间:2024/04/30 11:53

一.重载

   1.重载的定义:如果同一个作用域内的几个函数名字相同参数列表不同,称之为重载。

   1).重载作用在静态链接时

        重载发生在编译阶段。成员函数无论是否是虚函数都能重载。

   2).在同一个作用域(如一个类的内部)

    如果作用域不一样会发生什么呢?

     此时,局部作用域(相对来讲)与外部作用域(相对来讲),出现了变量(包括变量和函数)名字一样,则外部作用域定义的函数被隐藏。如:一个函数在父类中定义,此时子类中声明了一个相同函数名的函数,(子类的作用域包含于父类)则没有发生重载,而是隐藏。


   3).函数名称相同,返回值也相同,参数列表不同。

      1.仅仅返回值不同的不是是重载,编译器会报错。

      2.参数带const情况

参数是顶层constvoid Lookup(int a)   

                                    void Lookup(const int a)编译器会忽略顶层const,故这两个在编译器看来是同一个函数,无法完成重载。

指针类型(换成引用也一样):

                                    void Lookup(int*a)   

                                    void Lookup( int*const a 编译器会忽略顶层const,故这两个在编译器看来是同一个函数,无法完成重载。

        参数是低层const:

指针类型(换成引用也一样):

                                    void Lookup(int*a)   

                                    void Lookup( constint*a 可以完成重载

      3.省略了参数名字或仅仅参数名不同

        如:void Lookup(int a)

              void Lookup(int b)

              void Lookup(int )发生二义性问题,不能完成重载。编译器在看着三个函数一样。*只有在函数声明时,参数可省略,定义时不可以。

       4.缺省参数

如:void Lookup(int a,int b=0)

       void Lookup(int a)发生二义性问题,不能完成重载

   注意:main函数不可以重载。

  二.隐藏

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

  三.覆盖(重写)

     覆盖发生类的继承中,子类继承父类的虚成员函数,对其重写,实现动态绑定,用于运行时多态。

    1.覆盖的参数列表,函数名,返回值必须相同。

    2.函数在子类中,必须是虚函数,即有virtual关键字。

    3.覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者其子类;

    4.被覆盖的方法不能是private,因为子类没有访问父类private的权限。

  四.重载与覆盖区别

      1.覆盖发生在发生再父类到子类的继承过程,作用域不同,垂直关系。重载在同一个作用域,平行关系。

      2.重载发生在编译时,覆盖发生在运行时。

      3.重载要求函数名称相同,参数列表必须不相同,返回值类型相同。

       覆盖的参数列表,函数名,返回值必须相同。

      4.重载函数通过识别参数列表,匹配调用。覆盖函数,通过对象的不同来调用。






 

1 0
原创粉丝点击