`
yangyou230
  • 浏览: 1648348 次
文章分类
社区版块
存档分类

函数重载和覆盖区别

 
阅读更多

重载:在同一可访问区域内被声明的几个具有不同参数列(参数的类型、个数、顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数。注意,重载不关心函数的返回值类型。

① double calculate(double); 
② double calculate(double,double);
③ double calculate(double, int);
④ double calculate(int, double);
⑤ double calculate(int);
⑥ float calculate(float);
⑦ float calculate(double); 

六个同名函数calculate,①②③④⑤⑥中任两个均构成重载,⑥和⑦也能构成重载,而①和⑦却不能构成重载,因为①和⑦的参数相同。

覆盖是指派生类中存在重新定义基类的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。

重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如有两个同名函数:function func(p: integer): integer和function func(p: string):integer,那么编译器做过修饰后的函数名可能是这样的:int_func、str_func。对于这两个函数的调用,在编译期间就已经确定,是静态的,也就是说,它们的地址在编译期间就绑定了(早绑定),因此,重载和多态无关!

覆盖:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态地调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)

成员函数被重载的特征有:

l、相同的范围(在同一个类中);
2、函数名字相同;
3、参数不同;
4、virtual关键字可有可无。

覆盖的特征有:

l、不同的范围(分别位于派生类与基类);
2、函数名字相同;
3、参数相同;
4、基类函数必须有virtual关键字。

重载与覆盖的区别:

l、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。
2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求参数列表相同;重载要求参数列表不同。
4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。
分享到:
评论

相关推荐

    函数重载和覆盖的区别.doc

    函数重载和覆盖的 区别 函数重载和覆盖

    java中函数重载与覆盖例子

    java中函数重载与覆盖的例子,person类和teacher类

    类成员函数的重载、覆盖和隐藏

    类成员函数的重载、覆盖和隐藏区别以及抽象类等

    C++函数的重载和覆盖

    一个技术文档,记录一些关于C++方面的函数的重载和覆盖方法,可供参考

    虚函数与函数重载实验

    通过实例了解函数覆盖和函数重载之间的区别 实验前先复习“类与对象”、“派生与继承”、“多态性”部分的内容。 完成以下实验内容。在Visual Studio.NET上进行程序的编写和调试;思考题选做。 前两个课时完成“验证...

    C++成员函数的重载、覆盖与隐藏

    文件详细描述了C++成员函数的重载、覆盖与隐藏技术,对于初学C++的人员很有帮准,也是我们程序猿参考、学习的重要资料。

    类成员函数的重载、覆盖与隐藏之间的区别总结

    覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。 c.“隐藏”是指派生类的函数屏蔽了与其同名的基类...

    重载、覆盖、多态与函数隐藏

    要弄清楚重载、覆盖、多态与函数隐藏之间的复杂且微妙关系。这是C++基本功,几个概念容易混淆,易于掌握,要多运用。

    SigalHu#MyBlog#类中成员函数的重载、覆盖与隐藏[转]1

    原文:C++类成员函数的 重载、覆盖和隐藏区别重载成员函数被重载的特征:相同的范围(在同一个类中)函数名字相同参数不同virtual 关键字可有可无void s

    C++ 中函数重载、覆盖与隐藏详解

    在谈论C++中的函数重载、覆盖和隐藏之前,先回顾下函数的基础知识。 函数的声明包括函数的返回值类型,函数名称,参数列表(参数的类型、参数的个数、参数的顺序)。例如,声明一个两个整数之和的函数,int iAdd...

    重载与覆写/重写的区别

    方法重载只可以通过方法名和方法参数来区别,即“方法签名” * @return * @throws NumberFormatException */ public int getSides(Object obj) throws NumberFormatException { return 1; } /** * 2....

    Java语言中的 覆盖重载和多态

    Java语言中的覆盖重载和多态,方法的多态,类型的多态,多态的优点,覆盖(override)识别标志,方法的重载,构造函数的重载,重载的好处,重载与覆盖的比较,编译时多态和运行时多态

    C++中的函数重载、覆盖与隐藏

    在谈论C++中的函数重载、覆盖和隐藏之前,先回顾下函数的基础知识。  函数的声明包括函数的返回值类型,函数名称,参数列表(参数的类型、参数的个数、参数的顺序)。例如,声明一个两个整数之和的函数,int iAdd...

    delphi动态虚拟覆盖重载重定义的区别

    1、静态方法是方法的缺省类型,对它就像对通常的过程和函数那样调用,编译器知道这些方法的地址,所以调用一个静态方法时它能把运行信息静态地链接进可执行文件,所以,静态方法速度最快,但它们却不能被覆盖来支持...

    对比C++与Java中的函数重载、覆盖、和隐藏

     C++中的函数的重载要求的是 函数名相同 参数列表必须不同 返回值类型可以相同也可以不相同;只有参数列表不相同,在函数调用时,编译环境才能准确抉择调用的是哪个函数。例如:void display();void display...

    成员函数的重载、覆盖与隐藏详细解析

    1 重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生...

    C++全套学习课件函数的覆盖、隐藏和重载.pdf

    C++全套学习课件函数的覆盖、隐藏和重载.pdf

    重写重载构造函数

    重写重载构造函数 重写是子类的方法覆盖父类的方法,要求方法名和参数都相同

Global site tag (gtag.js) - Google Analytics