0
点赞
收藏
分享

微信扫一扫

面向对象 概念区分 多态和重载

最近在网上看到好多人都说 多态 和 重载 是一个东西, 但是根据我多年的知识积累总觉得不对,便在网上找到了一些网友的观点,记录如下:


多态是基于对抽象方法的覆盖来实现的,用统一的对外接口来完成不同的功能。重载也是用统一的对外接口

来完成不同的功能。那么两者有什么区别呢?

重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表

,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址编译期

就绑定了。

java  的重载是可以包括父类和子类的, 即子类可以重载父类的 同名 不同参数 的方法, 子类可以继承父类的重载

C++, 子类中若有同名函数则隐藏父类的其他同名函数,即子类如果有同名函数则不能继承父类的重载。

重载,是在编译阶段 便已确定具体的代码。对同名不同参数的 方法的调用。


多态:是指子类重新定义父类的虚方法(virtual,abstract)。当子类重新定义了父类的虚方法后,父类根据

赋给它的不同的子类,动态调用属于子类的该方法,这样的方法调用在编译期间是无法确定的


不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法:

对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;

(

重载,是指在一个类中的 同名不同参数的 函数调用。C++ 中继承的时候存在隐藏,java中不存在。
重载、覆盖 是继承中的概念。

)


而对于多态,只有等到方法调用的那一刻,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。 

重载和覆盖的区别

1. 重载要求函数名相同,但是参数列表必须不同,返回值可以相同也可以不同。

    覆盖要求函数名、参数列表、返回值必须相同。

2. 在类中重载是同一个类中不同成员函数之间的关系

    在类中覆盖则是子类和基类之间不同成员函数之间的关系

3. 重载函数的调用是根据参数列表来决定调用哪一个函数

    覆盖函数的调用是根据对象类型的不同决定调用哪一个

4. 在类中对成员函数重载是不能够实现多态

    在子类中对基类虚函数的覆盖可以实现多态


举报

相关推荐

0 条评论