多态和重载的区别

多态和重载的区别

重载可认为是静态的多态,静态联编,发生在编译阶段;

多态是动态的,动态联编,发生在运行阶段;

静态的比动态的效率高,但动态的最大优点是多态性,提高代码复用性。


(1)实现多态公有继承有两种机制

第一种是:在派生类中重新定义基类方法。重新定义的方法和基类中的方法完全一致。即,函数名一致,函数的返回值类型一致,参数列表一致,只是行为不同,这就是多态公有继承,多态必须品:① 继承;② 参数列表和返回值必须完全一致的同名函数,即虚方法

第二种是:虚方法。

(2)函数重载的关键是什么

关 键 在 于 函数的参数列表——特征标,
参数列表指的是参数的数量、参数的类型以及参数的顺序。函数的返回值类型可以相同也可以不同,但是若想实现函数的重载,参数列表必须不同。前提是函数名相同。注意:类型引用和类型本身为同一特征标,如:void show(int i) 和 void show(int &i)不是函数的重载,是一个函数。

关键字:函数多态;函数重载;区别

多态重载是面向对象编程中的两个重要概念,它们的区别主要体现在以下几个方面: ### 定义 - **多态**:不同对象对同一消息做出不同响应的能力,允许使用统一的接口来处理不同类型的对象。多态分为静态多态(编译时多态动态多态(运行时多态),静态多态函数重载运算符重载,动态多态通过派生类函数实现。函数调用地址在编译阶段确定的是静态多态,需要在运行时决定的则是动态多态 [^4]。 - **重载**:在同一作用域内,允许有多个同名函数,但这些函数的参数列表(参数的类型、个数、顺序)必须不同。编译器根据调用时的实参列表来选择合适的函数调用。 ### 发生位置 - **多态**:通常涉及继承关系,通过基类指针或引用调用派生类的重写方法来实现,强调不同类之间的关系 [^4]。 - **重载**:发生在同一个类中(也可以是命名空间等同一作用域),是同名函数在参数列表上的变化。 ### 绑定机制 - **多态**:动态多态是晚绑定(动态联编),函数的调用地址在运行时才能确定;静态多态是早绑定(静态联编),在编译阶段就可以确定函数的调用地址 [^4]。 - **重载**:属于编译时绑定,编译器在编译时根据实参的类型数量等信息来确定调用哪个重载函数。 ### 方法签名要求 - **多态**:在动态多态中,派生类重写基类的虚函数时,函数名、参数列表返回类型必须与基类的虚函数一致(协变返回类型除外)。 - **重载**:函数名相同,但参数列表必须不同,返回类型可以相同也可以不同。 ### 示例代码 以下是 Java 中多态重载的示例: ```java // 多态示例 class Animal { void speak() { System.out.println("Animal speaks"); } } class Dog extends Animal { @Override void speak() { System.out.println("Dog barks"); } } class Cat extends Animal { @Override void speak() { System.out.println("Cat meows"); } } class Main { public static void main(String[] args) { Animal dog = new Dog(); Animal cat = new Cat(); dog.speak(); cat.speak(); } } // 重载示例 class Calculator { int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值