重写与重载的区别

合集下载

函数重载和覆盖(重写)的区别

函数重载和覆盖(重写)的区别

函数重载和覆盖(重写)的区别1、重载:函数重载是指在同⼀作⽤域内(名字空间),可以有⼀组具有相同函数名,不同参数列表的函数;2、覆盖(也叫重写):指在派⽣类中重新对基类中的虚函数(注意是虚函数)重新实现。

即函数名和参数都⼀样,只是函数的实现体不⼀样;3、隐藏:指派⽣类中的函数把基类中相同名字的函数屏蔽掉了,隐藏与另外两个概念表⾯上看来很像,很难区分,其实他们的关键区别就是在多态的实现上。

下⾯那种情形下myfunc函数声明是重载?A. namespace IBM{int myfunc(int a);}namespace SUN{int myfunc(double b);}B. namespace IBM{int myfunc(int a);}namespace SUN{using IBM::myfunc;int myfunc(double b);}C. namespace IBM{int myfunc(int a);namespace SUN{int myfunc(double b);}}D. class A{public:int myfunc(int a);}class SubA: public A{public:int myfunc(double b);}答案是B,A和C都是名字空间不同;D是隐藏,只有B是重载!存在如下声明:void f (); //全局函数class A{public:void f(int);};class B: public A{public:void f(int *);static void f(int **);void test();//...};那么在如下B::test实现中哪⼏个函数调⽤是合法的:void B::test(){int x = 0;int *p = NULL;f(); //(1)f(x); //(2)f(&x); //(3)f(&p); //(4)};A.(1)(2)(3)(4)B.(1)(3)(4)C.(2)(3)(4)D.(3)(4)答案是D,类成员函数重载:局部同名函数将隐藏⽽不是重载全局声明,不引⼊⽗类名字空间时⼦类的同名函数不会和⽗类的构成重载,静态成员函数可以和⾮静态成员函数构成重载。

简述方法的重载与重写

简述方法的重载与重写

简述方法的重载与重写
方法的重载与重写是面向对象编程中常见的基本概念。

一、方法的重载
方法重载就是在同一个类中出现同名的两个或多个方法,这时,这些同名方法的参数列表必须不同,例如参数个数不同、参数类型不同或者参数顺序不同则可以实现重载。

重载可以提高程序的效率,可以根据参数的不同,返回不同的结果,避免了程序的冗长。

二、方法的重写
方法重写又叫方法覆写,它是在子类中重新定义父类已经存在的方法,当子类调用重写的方法时,将执行子类的方法,而不再执行父类的方法。

重写可以使子类拥有更复杂的行为,使得子类更具有实用性,解决父类中方法的缺点。

- 1 -。

简述方法的重载与重写

简述方法的重载与重写

简述方法的重载与重写重载和重写是Java中两个重要的概念,它们都是面向对象编程中的重要特性。

虽然它们都是在不同的上下文中使用的,但仍然存在一些相似之处。

下面是关于重载和重写的详细说明:重载:重载是指在同一个类中定义多个方法,这些方法具有相同的名称,但参数类型、个数或顺序不同。

重载方法的返回类型可以相同也可以不同。

当调用一个重载方法时,编译器会根据传递给方法的参数类型和数量来确定要调用哪个方法。

重载方法的优点在于可以使用相同的方法名来表示不同的操作,这样可以使代码更加简洁易懂。

例如,一个计算器类可以定义多个add 方法,用于对不同类型的数字进行加法运算。

重写:重写是指在子类中实现一个与父类中已有的方法具有相同名称、参数列表和返回类型的方法。

重写方法的目的是为了改变父类方法的实现,以适应子类的特定需求。

当调用一个重写方法时,实际调用的是子类中的方法,而不是父类中的方法。

重写方法的优点在于可以通过扩展父类的功能来实现子类的特定需求。

例如,一个动物类可以定义一个move方法,而子类可以重写该方法以实现特定类型的动物的移动方式。

总结:重载和重写是Java中两个重要的概念,它们都是面向对象编程中的重要特性。

重载是指在同一个类中定义多个方法,这些方法具有相同的名称,但参数类型、个数或顺序不同。

重写是指在子类中实现一个与父类中已有的方法具有相同名称、参数列表和返回类型的方法。

重载方法的优点在于可以使用相同的方法名来表示不同的操作,这样可以使代码更加简洁易懂。

重写方法的优点在于可以通过扩展父类的功能来实现子类的特定需求。

重写与重载的区别

重写与重载的区别

重写与重载的区别
1、定义上不同。

重载是指不同的函数使⽤相同的函数名,但是函数的参数个数或类型不同,
调⽤的时候根据函数的参数来区别不同的函数。

重写是指在派⽣类中重新对基类中的虚函数重新实现,
即函数名和参数都⼀样,只是函数的实现体不⼀样。

2、规则不同。

重载必须具有不同的参数列表,可以有不同的访问修饰符,可以抛出不同的异常。

重写的参数列表必须完全与被重写的⽅法相同,否则不能称其为重写⽽是重载,其返回的类型也必须⼀直与被重写的⽅法的返回类型相同。

重写⽅法⼀定不能抛出新的检查异常或者⽐被重写⽅法申明更加宽泛的检查型异常。

函数的重载和重写

函数的重载和重写

函数的重载和重写函数的重载和重写是C++中面向对象编程中的重要概念。

这是因为这两个概念可以帮助程序员创建更加灵活和高效的代码,从而提高程序的可重用性和可维护性。

在本文中,我将详细介绍函数的重载和重写,并且适当地比较它们之间的异同点。

函数的重载是指在同一个类中,可以定义多个同名的函数,但每个函数具有不同的参数列表。

通过这种方式,我们可以使用同样的函数名来表示不同的行为,从而简化程序的编写和调用。

1.函数的名称必须相同2.函数的参数列表必须不同3.函数的返回类型可以相同也可以不同下面给出一个简单的例子,展示如何定义重载函数:```cpp// 重载函数的例子#include <iostream>using namespace std;class Demo{public:void print(){cout << "Hello, World!" << endl;}void print(int n){cout << "The number is " << n << endl;}void print(double d){cout << "The number is " << d << endl;}};函数的重写是指子类中的函数可以覆盖父类中的同名函数。

这种行为称为多态,可以让程序具有更加灵活和可扩展的能力。

当父类指针或引用指向子类对象时,调用同名函数会根据指向的对象类型进行动态绑定,即调用子类中的函数。

这个过程称为动态多态。

class Shape{public:virtual void draw(){cout << "This is shape." << endl;}};三、重载与重写的区别函数的重载和重写都可以使程序更加灵活和高效,但是它们之间也存在着显著的区别。

重载与重写——精选推荐

重载与重写——精选推荐

重载与重写
重载就是同⼀个类中或⽗⼦类中,有多个⽅法名相同,但参数列表不同(包括参数个数和参数类型),与返回值⽆关,与权限修饰符也⽆关。

⽽调⽤重载的⽅法时通过传递给它们不同的参数个数和参数类型来决定具体使⽤哪个⽅法,这叫多态。

重写(覆盖)就是⼦类重写基类的⽅法,⽅法名,参数列表和返回值都必须相同,否则就不是重写⽽是重载。

重写最⼤的特点是权限修饰符不能⼩于被重写⽅法的修饰符。

且重写⽅法不能抛出新的异常或者是⽐被重写⽅法声明更加宽泛的检查型异常。

重写必须遵守两同两⼩⼀⼤原则
⽅法名相同,参数类型相同
⼦类返回类型⼩于等于⽗类⽅法返回类型,
⼦类抛出异常⼩于等于⽗类⽅法抛出异常,
⼦类访问权限⼤于等于⽗类⽅法访问权限。

面试题解七-java重载和重写的区别

面试题解七-java重载和重写的区别

⾯试题解七-java重载和重写的区别重载和重写的区别java中⽅法的重载和重写都是实现多态性的⼀种⽅式,区别在于前者实现多态性是在编译的时候,后者实现多态性是在运⾏的时候。

----重写(Override)----重写的前提是继承,是⼦类对⽗类的⽅法的实现过程进⾏重新编写,⽅法重写参数类型、个数、顺序必须完全⼀致。

重写的主要作⽤在于可以根据⼦类的需要,来特定属于⼦类的特定⾏为,这也是java多态性的⼀种实现⽅式。

例⼦:我们先创建⼀个动物类,该类中有⼀个move⽅法public class Animal {public void move(){System.out.println("动物在跑动");}}我们再创建⼀个猫类,猫类继承动物类并且重写move⽅法public class Cat extends Animal {@Overridepublic void move() {System.out.println("猫可以跑也可以⾛");}}这个⼦类中的move⽅法的⽅法名与⽗类⼀样,⽽且参数都为空,所以作为⼦类的猫类的move⽅法是对⽗类move⽅法的重写public class TestCat {public static void main(String[] args) {Animal a = new Animal();Animal b = new Cat();a.move();//执⾏⽗类animal中的move⽅法b.move();//执⾏⼦类cat中的move⽅法}}输出结果:说明在运⾏的时候,jvm选择了运⾏了特定对象b中重写的move⽅法⽅法重写规则总结⽗类的成员⽅法只能被它的⼦类重写,继承是重写的前提参数列表与被重写⽅法的参数列表必须完全相同访问权限不能⽐⽗类中被重写的⽅法的访问权限更低。

若⽗类的⽅法权限修饰符为public,那么⼦类⽅法重写的修饰符权限不能⽐public⼩(⽐如不能声明为protected)声明为 final 的⽅法不能被重写声明为 static 的⽅法不能被重写,但是能够被再次声明⽗类的构造⽅法,⼦类⽆法对其进⾏重写重写的⽅法能够抛出任何⾮强制异常,⽆论被重写的⽅法是否抛出异常。

Java基础之重载(Overload)与重写(Override)详解

Java基础之重载(Overload)与重写(Override)详解

Java基础之重载(Overload)与重写(Override)详解⽬录⼀、重载(Overload)⼆、重写(Override)三、重写与重载之间的区别四、总结⼀、重载(Overload)重载是在⼀个类⾥⾯,⽅法名字相同,⽽参数不同。

返回类型可以相同也可以不同。

每个重载的⽅法(或者构造函数)都必须有⼀个独⼀⽆⼆的参数类型列表。

最常⽤的地⽅就是构造器的重载。

重载的好处:1.不⽤为了对不同的参数类型或参数个数,⽽写多个函数。

2.多个函数⽤同⼀个名字,但参数表,即参数的个数或(和)数据类型可以不同,调⽤的时候,虽然⽅法名字相同,但根据参数表可以⾃动调⽤对应的函数。

3.重载的最直接作⽤是⽅便了程序员可以根据不同的参数个数,顺序,类型,⾃动匹配⽅法,减少写过个函数名或⽅法名的重复步骤。

4.增加代码可读性,执⾏同样功能但具有不同参数类型的⽅法应该使⽤同样的名字。

重载规则:1.被重载的⽅法必须改变参数列表(参数个数或类型不⼀样)。

2.被重载的⽅法可以改变返回类型。

3.被重载的⽅法可以改变访问修饰符。

4.被重载的⽅法可以声明新的或更⼴的检查异常。

5.⽅法能够在同⼀个类中或者在⼀个⼦类中被重载。

6.⽆法以返回值类型作为重载函数的区分标准。

歧义调⽤:public class TestMethodOverload {public static double max(double num1,double num2) {if(num1 > num2)return num1;elsereturn num2;}public static int max(int num1,int num2) {if(num1 > num2)return num1;elsereturn num2;}public static void main(String[] args) {System.out.println("The max of 3 and 4 is "+max(3,4));//调⽤max(int num1,int num2)⽅法System.out.println("The max of 3.0 and 4.0 is "+max(3.0,4.0));//调⽤max(double num1,double num2)⽅法System.out.println("The max of 3 and 4.0 is "+max(3,4.0));//调⽤max(double num1,double num2)⽅法,调⽤⽅法时实参值3会转换为double型}}调⽤max(3,4)时为什么不⽤max(double num1,double num2)⽅法呢?调⽤⽅法时,有时会有⼀个或多个可能的匹配,java编译器会寻找最精确匹配的⽅法。

JAVA重写和重载

JAVA重写和重载

JAVA重写和重载方法的重写Overriding和重载Overloading是Java多态性的不同表现。

重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

Overloaded的方法是可以改变返回值的类型。

也就是说,重载的返回值类型可以相同也可以不同。

1、重载(Overloading)a、方法重载是让类以统一的方式处理不同类型数据的一种手段。

多个同名函数同时存在,具有不同的参数个数/类型。

重载Overloading是一个类中多态性的一种表现。

b、Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。

调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。

c 、重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。

无法以返回型别作为重载函数的区分标准。

2、重写(Overriding)a、父类与子类之间的多态性,对父类的函数进行重新定义。

如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。

在Java中子类可继承父类中的方法,而不需要重新编写相同的方法。

但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。

方法重写又称方法覆盖。

b、若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。

this指示当前。

c、子类函数的访问修饰权限不能少于父类的;重写是子类的方法覆盖父类的方法,要求方法名和参数都相同重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,最常见的重载的例子就是类的构造函数,可以参考API帮助文档看看类的构造方法.构造方法和普通方法都能重载吗?2.构造方法和普通方法都能重写吗?3.重写的话是子类中的方法覆盖同名父类方法?重载的话覆盖是怎样的呢?(多同名方法情况下哪个覆盖哪个?)1 能2 能3 重写是方法名相同,参数也相同,重载是方法名相同,参数不同首先我们来讲讲:重载(Overloading)(1)方法重载是让类以统一的方式处理不同类型数据的一种手段。

方法的重载和重写有什么区别

方法的重载和重写有什么区别

方法的重载和重写有什么区别在面向对象编程中,方法的重载(Overload)和重写(Override)是两个重要的概念。

它们都涉及到方法的多态性,但是它们的实现方式和作用有所不同。

本文将从方法的重载和重写两个方面进行详细的介绍和比较,以帮助读者更好地理解它们之间的区别。

首先,我们来看看方法的重载。

方法的重载是指在同一个类中,可以有多个方法名相同但参数列表不同的方法。

也就是说,方法的重载是通过改变方法的参数列表来实现的。

在调用重载方法时,编译器会根据提供的参数类型和数量来确定调用哪个重载方法。

方法的重载可以使代码更加灵活,方便地处理不同类型的输入数据。

例如,我们可以编写一个名为“add”的方法,它可以接受两个整数相加,也可以接受两个浮点数相加,这样就实现了方法的重载。

接下来,我们来讨论方法的重写。

方法的重写是指子类重新定义了父类中已有的方法,使得子类可以根据自己的需要来实现该方法。

在重写方法时,子类必须保持方法名、参数列表和返回类型与父类中的方法一致。

通过方法的重写,子类可以改变父类方法的行为,实现自己特定的功能。

这种特性使得面向对象编程更加灵活和可扩展。

例如,我们可以定义一个名为“draw”的方法,在父类中它只是简单地打印一行文字“Drawing”,而在子类中可以重写这个方法,实现具体的图形绘制功能。

接下来,我们将重点比较方法的重载和重写之间的区别。

首先,方法的重载是在同一个类中实现的,而方法的重写是在父子类之间实现的。

其次,方法的重载是通过改变参数列表来实现的,而方法的重写是通过重新定义方法体来实现的。

另外,方法的重载是编译时多态,而方法的重写是运行时多态。

最后,方法的重载是静态绑定的,而方法的重写是动态绑定的。

总的来说,方法的重载和重写都是面向对象编程中实现多态性的重要手段。

通过方法的重载和重写,我们可以更加灵活地处理不同类型的数据和实现特定的功能。

在实际的编程过程中,我们需要根据具体的需求来选择合适的方法来实现多态性,以提高代码的可读性和可维护性。

方法重写与方法重载的区别

方法重写与方法重载的区别

方法重写与方法重载的区别
方法重写(Overriding)和方法重载(Overloading)是Java面向对象编程中的两个重要概念,它们的区别如下:
1. 定义:方法重写是指在子类中重新定义父类中已有的方法,要求方法名、参数列表和返回类型都要相同;方法重载是指在同一个类中定义多个方法,这些方法具有相同的名称但参数列表不同。

2. 实现:方法重写是通过继承实现的,子类可以根据需要重新定义相同方法名的方法;方法重载是在同一个类中实现的,通过定义相同方法名但参数列表不同的多个方法。

3. 调用:方法重写根据对象的实际类型来决定调用哪个方法,即多态性;方法重载根据传入的参数列表来决定调用哪个方法。

4. 与父类关系:方法重写是子类对父类的方法的继承和扩展,子类必须满足父类方法的重写条件;方法重载是在同一类中的方法,彼此之间没有继承关系。

总结来说,方法重写是对于已有方法的重新定义,要求方法名、参数列表和返回类型都要相同;方法重载是在同一个类中定义多个相同方法名但参数列表不同的方法。

方法重写在继承中具有多态性,方法重载在同一类中便于代码复用和提供
不同参数选项。

重载和重写的区别

重载和重写的区别

18. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?常考的题目。

从定义上来说:重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

重写:是指子类重新定义复类虚函数的方法。

从实现原理上来说:重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。

如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。

那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。

对于这两个函数的调用,在编译器间就已经确定了,是静态的。

也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!重写:和多态真正相关。

当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。

因此,这样的函数地址是在运行期绑定的(晚绑定)。

19. 多态的作用?主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

20. Ado与的相同与不同?除了“能够让应用程序处理存储于DBMS 中的数据“这一基本相似点外,两者没有太多共同之处。

但是Ado使用OLE DB 接口并基于微软的COM 技术,而 拥有自己的 接口并且基于微软的.NET 体系架构。

众所周知.NET 体系不同于COM 体系, 接口也就完全不同于ADO和OLE DB 接口,这也就是说 和ADO是两种数据访问方式。

提供对XML 的支持。

21.New delete 与malloc free 的联系与区别?答案:都是在堆(heap)上进行动态的内存操作。

java重写与重载的区别

java重写与重载的区别

重写与重载的区别实验组员:2022022124 陈剑明2022022138 李欢欢2022022129 张青2022021033 周超艳1.方法重写(Overriding)在 java 语言中,利用 extends 关键字来表示一个类继承了另一个类。

在 Java 中,子类可继承父类中的方法,而不需要重新编写一样的方法。

但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。

方法重写又称方法覆盖。

假设子类中的方法与父类中的某一方法具有一样的方法名、返回类型和参数表, 那么新方法将覆盖原有的方法。

如需父类中原有的方法,可使用super 关键字,该关键字引用了当前类的父类。

重写方法只能存在于具有继承关系中 , 重写方法只能重写父类非私有的方法。

方法重写是指在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配,那么可以说,子类的方法重写了父类的方法。

图1.1 方法重写图重写方法的规那么:1.1 参数列表必须完全与被重写的方法的一样 , 否那么不能称其为重写而是重载。

1.2 返回类型必须与被重写的方法的返回类型一样,否那么不是重写而是重载。

访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)图1.2 方法重写访问修饰符错误图1.3 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加广泛的检查型异常。

例如,父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出 Exception,只能抛出IOException 的子类异常,可以抛出非检查异常。

图1.3 方法重写异常等级错误图只允许多层继承,而不能多重继承:在JAVA中只允许单继承,不能使用多重继承,既一个子类只能继承一个父类。

但是允许进展多层继承,即一个子类可以有一个父类,一个父类还可以有一个父类。

Java重写(Override)与重载(Overload)区别原理解析

Java重写(Override)与重载(Overload)区别原理解析

Java重写(Override)与重载(Overload)区别原理解析这篇⽂章主要介绍了Java重写(Override)与重载(Overload)区别原理解析,⽂中通过⽰例代码介绍的⾮常详细,对⼤家的学习或者⼯作具有⼀定的参考学习价值,需要的朋友可以参考下重写(Override)重写是⼦类对⽗类的允许访问的⽅法的实现过程进⾏重新编写, 返回值和形参都不能改变。

即外壳不变,核⼼重写!重写的好处在于⼦类可以根据需要,定义特定于⾃⼰的⾏为。

也就是说⼦类能够根据需要实现⽗类的⽅法。

重写⽅法不能抛出新的检查异常或者⽐被重写⽅法申明更加宽泛的异常。

例如:⽗类的⼀个⽅法申明了⼀个检查异常 IOException,但是在重写这个⽅法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的⽗类,只能抛出 IOException 的⼦类异常。

在⾯向对象原则⾥,重写意味着可以重写任何现有⽅法。

实例如下:TestDog.java ⽂件代码:class Animal{public void move(){System.out.println("动物可以移动");}}class Dog extends Animal{public void move(){System.out.println("狗可以跑和⾛");}}public class TestDog{public static void main(String args[]){Animal a = new Animal();// Animal 对象 Animal b = new Dog(); // Dog 对象 a.move();// 执⾏ Animal 类的⽅法 b.move();//执⾏ Dog 类的⽅法 } }以上实例编译运⾏结果如下:动物可以移动狗可以跑和⾛在上⾯的例⼦中可以看到,尽管 b 属于 Animal 类型,但是它运⾏的是 Dog 类的 move⽅法。

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分

重载(Overload)和重写(Override)的区别。

重载的⽅法能否根据返回类型进⾏区分⾯试题:重载(Overload)和重写(Override)的区别。

重载的⽅法能否根据返回类型进⾏区分⾯试官考察点猜想这道题纯粹只是考查基础理论知识,对实际开发⼯作中没有太多的指导意义,毕竟编辑器都有语法提⽰功能,如果没写正确,会有错误提⽰。

背景知识详解关于重载(Overload)和重写(Override),在实际开发中使⽤⾮常频繁,涉及到的背景知识并不难。

重写重写是⼦类对⽗类的允许访问的⽅法的实现过程进⾏重新编写, 返回值和形参都不能改变。

即外壳不变,核⼼重写!重写是发⽣在类的继承关系,或者类的实现关系中的,重写后的⽅法和原⽅法需要保持完全相同的返回值类型、⽅法名、参数个数以及参数类型,简单来说,就是⼦类重写的⽅法必须和⽗类保持完全⼀致类的继承关系我们来看下⾯这个基于继承关系的例⼦。

class Animal{public void move(){System.out.println("动物可以移动");}}class Bird extends Animal{public void move(){System.out.println("鸟可以飞");}}class Dog extends Animal{public void move(){System.out.println("狗可以跑")}}public class TestMain{public static void main(String args[]){Animal a = new Animal(); // Animal 对象Animal b = new Bird(); //Bird对象Animal c = new Dog(); // Dog 对象a.move();// 执⾏ Animal 类的⽅法b.move(); //执⾏Bird类的⽅法c.move();//执⾏ Dog 类的⽅法}}上述程序运⾏的结果动物可以移动鸟可以飞狗可以跑在这个案例中,Animal是⼀个属于动物的抽象类,它定义了⼀个⽅法move()。

c++中重载,重写,覆盖

c++中重载,重写,覆盖

c++中重载,重写,覆盖1.重载重载从overload翻译过来,是指同⼀可访问区内被声明的⼏个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调⽤哪个函数,重载不关⼼函数返回类型。

1. 相同的范围(在同⼀个作⽤域中)2. 函数名字相同3. 参数不同列表4. virtual 关键字可有可⽆5. 返回类型可以不同int test();int test(int a);int test(int a,double b);int test(double a,int a);int test(string s);...3.重写 重写翻译⾃override,是指派⽣类中存在重新定义的函数。

其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数⼀致。

只有函数体不同(花括号内),派⽣类调⽤时会调⽤派⽣类的重写函数,不会调⽤被重写函数。

重写的基类中被重写的函数必须有virtual修饰。

1. 不在同⼀个作⽤域(分别位于派⽣类与基类)2. 函数名字相同3. 参数相同列表(参数个数,两个参数列表对应的类型)4. 基类函数必须有 virtual 关键字,不能有 static,⼤概是多态的原因吧...5. 返回值类型(或是协变),否则报错6. 重写函数的访问修饰符可以不同。

尽管 virtual 是 private 的,派⽣类中重写改写为 public,protected 也是可以的class Base{public:void test(int a){cout<<"this is base"<<endl;}};class Ship:public Base{public:void test(int a){cout<<"this is Base overwrite function"<<endl;}};3.隐藏 隐藏是指派⽣类的函数屏蔽了与其同名的基类函数。

c++重载与重写的区别

c++重载与重写的区别

c++重载与重写的区别重载:是指在同⼀个作⽤域内(⽐如⼀个类内部),函数根据参数类型或者参数个数等有关函数参数的差异声明不同函数,不能只根据函数返回值重载函数,如:class Base {public:Base() = default;~Base() = default;public:void function1(){printf("this is Base function1\n");}virtual void function2(){printf("this is Base function2\n");}int function3(int arg1, int arg2){printf("this is Base functio3 %d, %d\n", arg1, arg2);}int function3(char ch1, char ch2){printf("this is Base functio3 %d, %d\n", ch1, ch2);}};function3属于重载函数,虽然有两个function3但是两个函数参数类型不同。

重写:是有关多态的⼀种类型,⼦类重写⽗类的虚函数,如:class Base {public:Base() = default;~Base() = default;public:void function1(){printf("this is Base function1\n");}virtual void function2(){printf("this is Base function2\n");}};class Child : public Base {public:Child() = default;~Child() = default;public:void function1(){printf("this is Child function1\n");}virtual void function2(){printf("this is Child function2\n");}};Child类的function2重写⽗类Base的function2.所以具体区别可以总结为:(1)范围区别:重载和被重载的函数在同⼀类中,重写和被重写的函数在不同的类中。

C++重写重载重定义的比较

C++重写重载重定义的比较

C++重写重载重定义的⽐较 C++函数重定义、重载、重写1. 重写 (override):⽗类与⼦类之间的多态性。

⼦类重新定义⽗类中有相同名称和参数的虚函数。

1) 被重写的函数不能是 static 的。

必须是 virtual 的 ( 即函数在最原始的基类中被声明为 virtual ) 。

2) 重写函数必须有相同的类型,名称和参数列表 (即相同的函数原型)3) 重写函数的访问修饰符可以不同。

尽管 virtual 是 private 的,派⽣类中重写改写为 public,protected 也是可以的2. 重载 (overload):指函数名相同,但是它的参数表列个数或顺序,类型不同。

但是不能靠返回类型来判断。

3. 重定义 (redefining):⼦类重新定义⽗类中有相同名称的⾮虚函数 ( 参数列表可以不同 ) 。

重写与重载的区别 (override) PK (overload)1、⽅法的重写是⼦类和⽗类之间的关系,是垂直关系;⽅法的重载是同⼀个类中⽅法之间的关系,是⽔平关系。

2、重写要求参数列表相同;重载要求参数列表不同。

3、重写关系中,调⽤那个⽅法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调⽤时的实参表与形参表来选择⽅法体的。

class Base{private:virtual void display() { cout<<"Base display()"<<endl; }void say(){ cout<<"Base say()"<<endl; }public:void exec(){ display(); say(); }void f1(string a) { cout<<"Base f1(string)"<<endl; }void f1(int a) { cout<<"Base f1(int)"<<endl; } //overload};class DeriveA:public Base{public:void display() { cout<<"DeriveA display()"<<endl; } //overridevoid f1(int a,int b) { cout<<"DeriveA f1(int,int)"<<endl; } //redefiningvoid say() { cout<<"DeriveA say()"<<endl; } //redefining};class DeriveB:public Base{public:void f1(int a) { cout<<"DeriveB f1(int)"<<endl; } //redefining};int main(){DeriveA a;Base *b=&a;b->exec(); //display():version of DeriveA call(polymorphism)//say():version of Base called(allways )a.exec(); //same result as last statementa.say();//a.f1(1); //error:no matching function, hidden !!DeriveB c;c.f1(1); //version of DeriveB called}注意:在 C++ 中若基类中有⼀个函数名被重载,在⼦类中重定义该函数,则基类的所有版本将被隐藏——即⼦类只能⽤⼦类定义的,基类的不再可⽤。

C++重载、重写、重定义

C++重载、重写、重定义

C++重载、重写、重定义⼀、重载(overload)指函数名相同,但是它的参数表列个数或顺序,类型不同。

但是不能靠返回类型来判断。

(1)相同的范围(在同⼀个作⽤域中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可⽆。

(5)返回值可以不同;⼆、重写(也称为覆盖 override)是指派⽣类重新定义基类的虚函数,特征是:(1)不在同⼀个作⽤域(分别位于派⽣类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有 virtual 关键字,不能有 static 。

(5)返回值相同(或是协变),否则报错;<—-协变这个概念我也是第⼀次才知道…(6)重写函数的访问修饰符可以不同。

尽管 virtual 是 private 的,派⽣类中重写改写为 public,protected 也是可以的三、重定义(也成隐藏)(1)不在同⼀个作⽤域(分别位于派⽣类与基类);(2)函数名字相同;(3)返回值可以不同;(4)参数不同。

此时,不论有⽆ virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆)。

(5)参数相同,但是基类函数没有 virtual关键字。

此时,基类的函数被隐藏(注意别与覆盖混淆)。

#include <iostream>#include <complex>using namespace std;class Base{public:virtual void a(int x) { cout << "Base::a(int)" << endl; }// overload the Base::a(int) functionvirtual void a(double x) { cout << "Base::a(double)" << endl; }virtual void b(int x) { cout << "Base::b(int)" << endl; }void c(int x) { cout << "Base::c(int)" << endl; }};class Derived : public Base{public:// redefine the Base::a() functionvoid a(complex<double> x) { cout << "Derived::a(complex)" << endl; }// override the Base::b(int) functionvoid b(int x) { cout << "Derived::b(int)" << endl; }// redefine the Base::c() functionvoid c(int x) { cout << "Derived::c(int)" << endl; }};int main(){Base b;Derived d;Base* pb = new Derived;// ----------------------------------- //b.a(1.0); // Base::a(double)d.a(1.0); // Derived::a(complex)pb->a(1.0); // Base::a(double), This is redefine the Base::a() function// pb->a(complex<double>(1.0, 2.0)); // clear the annotation and have a try// ----------------------------------- //b.b(10); // Base::b(int)d.b(10); // Derived::b(int)pb->b(10); // Derived::b(int), This is the virtual function// ----------------------------------- //delete pb;return0;}通过这⾥可以看出:1.Base类中的第⼆个函数a是对第⼀个的重载2.Derived类中的函数b是对Base类中函数b的重写,即使⽤了虚函数特性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

重写与重载的区别
1.重写
override是重写了一个方法,以实现不同的功能。

一般是用于子类在继承父类时,重写(重新实现)父类中的方法。

重写(覆盖)的规则:
a)重写方法的参数列表必须完全与被重写的方法的相同,否则不能
称其为重写而是重载.
b)重写方法的访问修饰符一定要大于被重写方法的访问修饰符
(public>protected>default>private)。

c)重写的方法的返回值必须和被重写的方法的返回一致;
d)重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,
或者是其子类;
e)被重写的方法不能为private,否则在其子类中只是新定义了一个
方法,并没s有对其进行重写。

f)静态方法不能被重写为非静态的方法(会编译出错)。

2.重载
overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。

重载的规则:
a)在使用重载时只能通过相同的方法名、不同的参数形式实现。


同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);
b)不能通过访问权限、返回类型、抛出的异常进行重载;
c)方法的异常类型和数目不会对重载造成影响;
多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。

一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。

3.对比
对两者比较,可以发现多态对重载的优点:
如果用重载,则在父类里要对应每一个子类都重载一个取得边数的方法;
如果用多态,则父类只提供取得边数的接口,至于取得哪个形状的边数,怎样取得,在子类里各自实现(重写)。

相关文档
最新文档