重载和覆盖 区别?

来源:百度知道 编辑:UC知道 时间:2024/05/06 20:04:27

重载是可使函数、运算符等处理不同类型数据或接受不同个数的参数的一种方法,关于重载一词在词义上有两种不同的说法:
  重载是一种多态(如C++),有四种形式的多态:
  1.虚函数多态
  2模板多态
  3重载
  4转换
  所谓的动态和静态区分是另一种基于绑定时间的多态分类,严格来说,重载是编译时多态,即静态多态,根据不同类型函数编译时会产生不同的名字如int_foo和char_foo等等,以此来区别调用。故重载仍符合多态定义——通过单一标识支持不同特定行为的能力,只是重载属于静态多态,而不是通过继承和虚函数实现的动态多态。
  重载和多态无关,真正和多态相关的是覆盖。
  当派生类重新定义了基类的虚拟方法后,基类根据赋给它的不同的派生类引用,动态地调用属于派生类的对应方法,这样的方法调用在编译期间是无法确定的。因此,这样的方法地址是在运行期绑定的(动态绑定)。
  重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。
  不过针对所谓的第二种重载,有一个专门的名词--重写或重定义。重载与重写的区别就在于是否覆盖,重写一般多发生在不同的类且存在继承关系之间,而重载多是在一个类里或者一块代码段里。
  特点:
  由于重载可以在同一个类中定义功能类似的函数,这给程序员管理类的相似函数提供了极大的方便。例如,在一个定义圆的类中,需要设定圆心和半径来确定一个圆对象,程序员不需要设定setRadius(float r)和SetPoint(float x,float y)两个不同名函数,而只需要设定一个CSetCicle函数名就够了。在这个简单的例子中重载并没有明显的优势,可是当一个类中相似功能函数有几十、上百个的时候,重载的优势就显现出来了,这时程序员不需要去记这么繁多的函数名,可以把更多的精力放在程序本身上。重载的方法只属于子类。

重载是让同名的方法根据不同的数据类型可以处理和返回不同类型的数据。而覆盖则与作用域有关了,在子类中与父类同名的方法,在子类中父类的方法就不能被调用,可以说被屏蔽了。

重载是让同一方法名的方法可以处理和返回不同类型的数据

而覆盖是在子类中改写父类的方法