重载,重写(覆盖),隐藏

来源:互联网 发布:linux 第二个mysql5.7 编辑:程序博客网 时间:2024/05/21 12:47
重载:
     是指同一作用域内被声明的几个具有不同参数列表(参数的类型,参数的个数的不同)的同名函数。根据参数列表确定调用哪个函数,重载不关心函数返回类型。重载函数通常用来描述一组功能相似的函数,这样做可以减少函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。

编译器是怎么解决命名冲突的问题的?
     重载的函数名在反汇编代码下,所有的函数名全部变成了“返回值类型 + 函数名 + 参数列表”
     如void print(int i)   -->  _Z5printi   _Z5是函数的返回值类型, print是函数名,i是参数类型int
        void print(string str)  --> _Z5printSs     _Z5是函数的返回值类型, print是函数名,Ss是参数类型string

编译器是如何解析重载函数的调用的?
     编译器在实现重载函数调用机制的时候,肯定得首先找到一些同名的候选函数,然后再这些候选函数中找到最符合的,如果找得到就调用,找不到就报错。

关于重载函数的作用域
     函数重载只在同一作用域下有效,如果不是同一作用域,即使函数名相同也不能称作是函数重载。
     即内层作用域的函数会隐藏外层作用域的同名函数。同理,派生类的同名函数会隐藏基类的同名函数。

隐藏:
     隐藏和重写都发生在继承关系中。隐藏是指派生类中的函数屏蔽了基类中的同名函数。
     (1)如果派生类中的成员函数和基类中的成员函数同名,如果参数列表相同,那么如果基类的同名函数没有加virtual关键字,此时基类的同名函数被隐藏。
     (2)如果派生类中的成员函数和基类中的成员函数同名,如果参数列表不同,那么不管基类的同名函数有没有加上virtual关键字,此时基类的同名函数都将被隐藏。

重写(覆盖):
     重写和隐藏都发生在继承关系中。重写是指派生类中的同名函数覆盖基类的同名函数,前提条件是函数名,参数列表,返回值必须相同,且基类的同名函数必须加上了virtual关键字,这才构成了重写。

原创粉丝点击