精华内容
下载资源
问答
  • 三重-------函数重载,函数重写(同名覆盖),函数重定义(同名隐藏) 一、函数重载 直接上图吧! 概念:函数重载是一种特殊情况,C++允许在同一作用域中声明几个...

    一、函数重载

    • 直接上图吧!
      在这里插入图片描述
    • 概念:函数重载是一种特殊情况,C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。
    • 实现原理

      • 为什么C语言不支持函数重载,c++却支持函数重载,简单来说,也就是两种语言对函数后期函数名修饰规则不同,
      C语言的函数名修饰规则
      int Add(int x, int y)
      {
      	return x+y;
      }
      
       
      • 1
      • 2
      • 3
      • 4
      • 这是一个简单的求两数之和的函数,在C语言中,编译器会在函数名处理成_Add,就是简单的在本身的函数名前加一个"_",假如有多个同名的函数,编译器识别不了到底是哪个函数,所以C语言不支持函数重载。
      c++的函数名字修饰规则
      • c++会将上面的函数修饰成**?Add@@YAHHH@Z **(各个版本不同),那么这些符号表示什么意思是呢?
      • 其中‘?’标识函数名的开始,其后跟函数名,“@@YA”标识参数表的开始,其后跟的第一个字符代表函数的返回值类型,接下来的字符依次代表函数参数列表中各个参数的类型;
      • 各个类型的代号:
        在这里插入图片描述
      • 所以@@yg后面的HHH分别代表三个int类型,其中第一个为函数返回值,上下两个为参数类型,@z标识整个名字结束。
      • 这样以来,c++处理函数名字的时候,把参数的不同也加入到函数名字修饰规则之中,因此不同的参数的同名函数,我们表面上看函数名字相同,其实编译器可以辨别出,
      函数重载的作用
      • 减少了函数名的数量,避免出现重定义,避免了命名污染;
      • 提高程序可读性。
      • 在编译期间根据参数的不同就能决定调用哪一个函数,叫做静态重载。

      二,函数重写

      • 概念派生类基类同名虚函数的改写就叫函数重写
      • 分析:1,函数重写发生在子类和父类之间, 2,父类中含有虚函数(virtual修饰的函数),3,子类中含有同父类虚函数相同原型的函数,4,只有在运行期间才能决定调用哪一个函数,叫做动态重载
      实列分析

      在这里插入图片描述

      • 上面的例子涉及到一个小知识,就是赋值兼容规则,在第二次调用Func函数的时候,我传的实际参数为派生类对象,但是Func函数本身的形参是基类的引用,依据派生类的对象模型可以知道,基类的引用或者指针可以赋值或者指向派生类的对象,
      赋值兼容规则
      • 基类的指针,引用可以指向派生类的对象;
      • 派生类的对象可以赋值给基类,基类的对象不可以赋值给派生类;
      • 基类的指针可以通过强制类型转换赋值给派生类的指针。但是必须是基类的指针是指向派生类对象时才是安全的。
      虚函数重写的例外:协变
      • 概念:重写的虚函数的返回值可以不同,但是必须分别是基类指针和派生类指针或者基类
        引用和派生类引用

      三,函数重定义(同名隐藏)

      • 概念:派生类的函数屏蔽了与其同名的基类函数
      • 分析:1,首先也是基于继承体系中的, 2,基类和派生类中有同名的函数,3,在调用这个函数的时候,用派生类对象调用只会调用自己的函数,基类的同名函数被隐藏。
      实例分析

      在这里插入图片描述

      • 还是刚才的代码,通过派生类调用同名函数,会调用到自己的,要是调用基类的函数,需要加作用于限定符。

      四,总结

      函数重载条件
      • 发生在同一作用域
      • 只有函数名字相同
      • 参数列表不同(参数类型,个数,顺序)
      • const也可以构成重载,
      • 全缺省函数和无参数的函数也可以构成重载(最好只出现一个)
      • 与函数的返回类型无关
      函数重写条件
      • 发生在不同作用域,一个函数在基类,一个函数在派生类
      • 函数名字和参数必须相同(参数相同,返回值相同)
      • 基类的同名函数是虚函数(有virtual修饰)
      • 派生类要对同名函数进行改写,
      函数重定义(同名隐藏)
      • 发生在不同作用域,一个在基类,一个在派生类;
      • 基类和派生类具有同名函数(仅仅函数名字相同)
      • 派生类要调用这个函数时,只会调用自己的,会把基类的同名函数隐藏起来
      • 要调用基类的同名函数,需要加作用于限定符
    展开全文
  • 函数重载覆盖

    2019-07-24 10:09:15
    一、函数重载(重定义) 1、函数重载: 2、函数重载在C语言中为啥不能共存 3、C++中函数重载 4、函数重载的特点:(重载的三要素) 二、覆盖 1、覆盖函数: 2、覆盖的特征: 三、重载和覆盖的区别 四、程序...

    目录

    一、函数重载(重定义)

    1、函数重载:

    2、函数重载在C语言中为啥不能共存

    3、C++中函数重载

    4、函数重载的特点:(重载的三要素)

    二、覆盖

    1、覆盖函数:

    2、覆盖的特征:

    三、重载和覆盖的区别

    四、程序示例


    一、函数重载(重定义)

    1、函数重载:

    重载是指函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(同名,参数类型、个数、顺序不同)。

    对于重载函数的调用,在编译期间就已经确定,是静态的,它们的地址在编译期间就绑定了与多态无关。

    2、函数重载在C语言中为啥不能共存

    (1)C语言没有函数重载,重载是C++的内容

    (2)C语言不能重载与函数编译后函数名有关

             编译后函数名变化只是在原来的函数名前加了一个下划线,所以当同名的函数参数不同时,编译器是无法解析到它们的不同, 因为它们编译后的名称都相同,所以c语言不能函数重载

    3、C++中函数重载

    (1)返回值   //无关  返回值不参与重载

    重载决议:调用点和定义点进行匹配:类型匹配

    调用点只能看到函数名和实参,返回值不能做调用点的依据,因此也不能做函数重载的依据

    (2)函数名     //无关

    ?Sum@@YAHHH@Z    int H      //函数符号生成不同

    ?Sum@@YANNN@Z    double N

    (3)形参:     //有关

    参数个数

    参数类型

    参数数据

    4、函数重载的特点:(重载的三要素)

    (1)同名

    (2)不同参

    (3)同作用域:      //C++有就近原则

    二、覆盖

    1、覆盖函数:

    覆盖是指派生类中存在重新定义基类的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,它和多态真正相关。

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

    2、覆盖的特征:

    (1)不同的范围(分别位于派生类和基类)

    (2)函数名字相同

    (3)参数相同

    (4)基类函数必须有virtual关键字

    三、重载和覆盖的区别

    1、覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系

    2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系

    3、覆盖要求参数列表相同;重载要求参数列表不同

    4、覆盖关系中,调用方法体是根据对象的类型(对相对应存储空间类型)来决定的;重载关系是根据调用时的实参表与形参表来选择方法体的

    四、程序示例

    #include<iostream>
    using namespace std;
    
    class Base
    {
    public:
    	void f(int x)
    	{
    		cout<<"Base::f(int)"<<x<<endl;
    	}
    	void f(float x)
    	{
    		cout<<"Base::f(float)"<<x<<endl;
    	}
    	virtual void g(int y)
    	{
    		cout<<"Base::g(int)"<<y<<endl;
    	}
    };
    class Derived:public Base
    {
    public:
    	virtual void g(int y)
    	{
    		cout<<"Derived::g(int)"<<y<<endl;
    	}
    };
    
    int main()
    {
    	Derived d;
    	Base *pb = &d;
    	pb->f(42);
    	pb->f(3.14f);
    	pb->g(24);
    	return 0;
    }

    (1)函数Bse::f(int)与Base::f(float)相互重载;

    (2)Base::g(void)与Derived::g(void)覆盖;

     

    展开全文
  • 函数重载:  在同一区域,同名函数的形参(个数、类型、顺序)不同,他们之间构成重载关系。重载函数常用来实现功能类似而所处理的数据类型不同的问题。 函数覆盖:   在父类与子类之间,其函数名、参数类型、参数...

    函数重载

         在同一区域,同名函数的形参(个数、类型、顺序)不同,他们之间构成重载关系。重载函数常用来实现功能类似而所处理的数据类型不同的问题。

    函数覆盖:

       在父类与子类之间,其函数名、参数类型、参数顺序、参数个数、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本。

    函数隐藏

    1. 不同区域内(父子类间)的函数重载。无论有无virtual关键字,只要函数的形参不同(类型、顺序、个数)。
    2. 基类中的函数没有virtual,基类与派生类之间函数同名、参数也相同(类型、顺序、个数)

    展开全文
  • 函数重写(覆盖)和函数重定义(同名隐藏)都是针对不同作用域来说的。...函数重载是针对同一作用于来说的。 要求函数名字相同,参数列表不同(参数类型,个数,顺序)。 函数重载与函数的返回类型无关。

    函数重写(覆盖)和函数重定义(同名隐藏)都是针对不同作用域来说的。

    • 函数重写(覆盖)
      函数重写就是覆盖,指的是虚函数的实现,虚函数实现时各个函数的名称、参数、返回值全部相同。

    • 函数重定义(同名隐藏)
      函数重定义(同名隐藏)要求函数同名,有以下两种情况:
      参数不同,不论有无virtual关键字都是发生同名隐藏
      参数相同,当基类无virtual关键字时才发生同名隐藏

    • 函数重载
      函数重载是针对同一作用域来说的。
      要求函数名字相同,参数列表不同(参数类型,个数,顺序)。
      函数重载与函数的返回类型无关。

    展开全文
  • 成员函数重载覆盖与隐藏 成员函数重载覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚 概念,否则错误将防不胜防。 8.2.1 重载覆盖 成员函数重载的特征: (1)相同的范围(在同一个类中...
  • 函数重载 直接上图把
  • 上述代码中,虽然子类Drived继承了基类的int参数型foo函数,自己又有string参数型foo函数,这不算函数重载,这里发生的是“同名覆盖”。 记得应该有这么个结论:“ 函数重载只发生在一个类内部,同名覆盖只发生在...
  • 重载:只发生在同一类成员函数中,同一类的具有不同参数的同名成员函数构成  重载。用作静态多态,静态多态还包括模板。 隐藏:发生在不同类中,子类中的函数会使得基类所有同名函数被隐藏。可以通过 base_name::...
  • 成员函数重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。 b.覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与...
  • python中的__init__函数重载覆盖问题

    万次阅读 2016-03-17 00:26:26
    python中的init函数重载覆盖问题先看一段代码,利用重载特性实现了多个init函数。# coding:utf-8urlHk = 'http://apis.baidu.com/apistore/stockservice/hkstock?stockid=%s&list=1' urlSh = '...
  • 函数重载:1. 作用域相同(同一类中)2. 参数不同(类型或者个数)3. 函数名相同4. 基类关键字Virtual关键字可有可无 函数覆盖:子类覆盖父类的同名函数(虚函数),同名+同参1. 作用域不同(子类和父类...
  •  C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的... 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对
  • 函数重载与函数覆盖的区别

    千次阅读 2019-03-18 09:40:51
    函数重载与函数覆盖的区别? (1)函数重载函数重载发生在同一个类的内部。这组函数具有相同的函数名,但是参数列表不相同,在函数调用过程中根据传入的实参类型,匹配最佳的函数并调用。 (2)函数覆盖发生在...
  • 定义  “隐藏”是指派生类的函数屏蔽了与其同名的基类函数,具体规则:  如果派生类的函数与基类的函数同名,...(注意别与重载混淆,虽然函数名相同参数不同应称之为重载,但这里不能理解为重载,因为派生类和基类
  • 成员函数重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。 二.覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于...
  • C++中函数重载覆盖与隐藏的区别

    千次阅读 2013-06-13 21:13:01
    重载(overload):指函数有不同的参数表,对同名函数的名称做修饰,然后这些同名函数就构成了不同的函数。在同一可访问区域内被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,程序会根据...
  • (1)多态函数指的是在运行期绑定的函数,在c++中,仅有虚函数是在运行期进行绑定的,因此只有虚函数才具有真正意义上的多态。  补充一下:c++中的多态有以下三个前提条件:  a.必须存在一个继承体系结构。 ...
  • 成员函数重载覆盖与隐藏成员函数重载覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防。在看《高质量c/c++》中看到了函数的隐藏和覆盖是这么说的:覆盖的是指子类函数覆盖...
  • 重载: 成员函数重载的特征: 1) 相同的范围:在同一个类中 2) 函数名相同,参数不同 3) virtual可有可无 ...派生类的函数屏蔽了与其同名函数: 1)派生类的函数名和基类的函数名相同,但是
  • 函数重载:同一个类中的同名函数,参数的类型或个数不同(返回值不同不算) 函数重写(覆盖):子类继承父类,重写父类的函数,即多态,通过虚函数实现。 函数重定义(隐藏):子类中与父类函数同名,不要求函数...
  • 函数重载、函数覆盖以及函数隐藏

    千次阅读 2010-03-23 17:19:00
    函数重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或者两者都不相同),函数重载是发生在同一个类中。调用时,根据参数的不同进行调用。同时编译器在编译期间就...
  • “override”翻译过来是:重置,覆盖,使原来的失去效果。 先来说说重载的含义,在日常生活中我们经常要清洗一些东西,比如洗车、洗衣服。尽管我们说话的时候并没有明确地说用洗车的方式来洗车,或者用洗衣服的方式...
  • C++函数重载覆盖与隐藏的区别

    千次阅读 2013-06-06 16:52:06
    成员函数重载,其特点: (1)在同一个类中; (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。   二.覆盖是指派生类函数覆盖基类函数,其特点: (1)位于派生类与基类中; (2...
  • C++中函数重载,覆盖(重写)和隐藏详解 一:函数重载基本知识:  1.函数重载的定义:  在相同的作用域内的同名函数.  不同作用域内的同名函数通过作用域来区分不形成重载.    2.函数重载的处理方式:编译器...
  • 8.1 函数重载的概念 8.1.1 重载的起源  自然语言中,一个词可以有许多不同的含义,即该词被重载了。人们可以通过上下文来判断该词到底是哪种含义。“词的重载”可以使语言更加简练。例如“吃饭”的含义...
  • 函数重载、函数覆盖、函数隐藏之间的关系 a.成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。 b.覆盖是指派生类函数覆盖基类函数,...
  • 覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。 c.“隐藏”是指派生类的函数屏蔽了与其同名的基类...
  • 在C++语言中,虚函数是非常重要的概念,虚函数是实现C++面向对象中多态...掌握虚函数才算是真正掌握C++语言,而C++语言中虚函数的继承覆盖函数重载有些类似,很多初学者搞不清他们之间的关系。 首先要明确覆盖(ov

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,361
精华内容 29,344
关键字:

函数重载同名覆盖