0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++:重载、重定义和重写的概念和区分

如意 来源:CSDN 作者:cherrydreamsover 2020-06-29 11:33 次阅读

C++中我们经常会遇见“重载、重定义、重写”的概念,三个概念名字很像,很容易混淆,今天我们对三者进行一个区分。

1.重载(overload

函数重载是函数的一种特殊情况,其特点是:

(1)在同一作用域(全局作用域、局部作用域、类作用域);

(2)函数名相同;

(3)形参列表(参数个数、参数类型、参数顺序)必须不同;

(4)返回值可以不同;

(5)virtual关键字可有可无。

举例:

下面,我们看一看这种情况能否构成重载?

根据上面我们所说的重载的特点,看起来这两个函数好像还可以构成重载,但实际上是不可以的,原因是:仅仅返回值类型不同,不能构成重载!

2.重写(覆盖)

覆盖是C++多态的实现基础,指派生类重新定义基类的虚函数。其特点是:

(1)在不同的作用域中(分别在基类和派生类中);

(2)函数名相同;

(3)参数相同;

(4)返回值类型相同(协变例外:基类中的虚函数返回Base*,派生类中返回Derived*);

(5)基类函数必须有virtual关键字,派生类可有可无(因为派生类继承基类后就会有该关键字),但基类不能有static关键字;

(6)访问修饰符可以不同(例如基类virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的)。

举例:

3.重定义(隐藏)

在继承体系中,子类和父类中有同名成员,子类成员将屏蔽父类对成员的直接访问。(在子类成员中,可以使用基类: :基类成员访问)。重定义的特点如下:

(1)在不同的作用域中(分别在基类和派生类中);

(2)函数名相同;

(3)返回值可以不同;

(4)在基类和派生类中,只要不构成重写就是重定义(即:参数相同时:基类没有关键字virtual,基类的函数被隐藏;参数不同时:无论基类有无关键字virtual,基类函数都被隐藏)。

举例:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3859

    浏览量

    61297
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72880
  • 重载
    +关注

    关注

    0

    文章

    7

    浏览量

    2741
收藏 人收藏

    评论

    相关推荐

    关于C++中的函数重载机制

    函数重载C++的新增机制,是在同一个作用域中能声明定义多个同名字的函数.(我们知道函数的名字是函数代码块的起始地址,这个首地址能够将函数的控制权转移给这个代码块的区域).在定义多个同
    发表于 10-01 17:18

    函数重载隐藏覆盖的区别

    `1.1 覆盖隐藏重载重载,隐藏(定义),覆盖(重写)—这几个名词看着好像很像,不过其实一样都不一样!!1.1.1 重载:(1)
    发表于 05-11 09:33

    关于C++虚函数是否必须重写

    说法1:网上说如果不是纯虚函数,子类可以不重写父类的虚函数。说法2:C++primer书上说的。所有的虚函数必须提供定义。此处的“定义”我理解为“
    发表于 05-13 11:46

    如何把C++的源程序改写成C语言

    起不同的名字,没有别的解决办法。2)运算符重载运算符重载只是为了满足一般的运算符使用的习惯而又不会出现错误。C中不支持运算符重载,可以定义
    发表于 06-30 10:54

    如何把C++的源程序改写成C语言

    为了满足一般的运算符使用的习惯而又不会出现错误。C中不支持运算符重载,可以定义一个函数实现该功能。这是一般类的修改。七.其他以上就是C++中主要的与
    发表于 07-05 14:59

    如何把C++的源程序改写成C语言

    中的类的概念和特性,将C++改为C的问题,就转换成如何将类化去的问题。方法有两种:第一种是将C++中的面向对象特征去掉,先全部理解源代码的逻辑,然后改写;第二种是在
    发表于 07-07 09:31

    嵌入式-C++函数的重载

    的函数名定义,从而形成重载,方便使用,某种层度上函数的重载也是C++三大特性之一的多态的一种形式 三、函数重载的应用场景 #include
    发表于 06-28 13:54

    漫谈java中重载重写的不同

    是一个类中多态性的一种表现。 (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。 (3)
    发表于 09-26 17:56 0次下载

    干货:三大实例讲解三种C++运算符重载

    本章节主要讲解是运算符重载。运算符重载是赋予运算符能操作自定义类型的功能。C++运算符重载主要分为以下三类:
    的头像 发表于 09-30 16:59 3182次阅读
    干货:三大实例讲解三种<b class='flag-5'>C++</b>运算符<b class='flag-5'>重载</b>

    C++之操作重载符学习的总结(二)

    复数的概念可以通过自定义类实现;复数中的运算操作可以通过操作符重载实现;赋值操作符只能通过成员函数实现;操作符重载的本质为函数定义
    的头像 发表于 12-24 16:26 403次阅读

    C++之操作符重载学习的总结

    操作符重载c++的强大特性之一;操作符重载的本质是通过函数扩展操作符的功能;operator 关键字是实现操作符重载的关键。
    的头像 发表于 12-24 16:36 509次阅读

    C++重载函数学习总结

    函数重载c++对c的一个重要升级;函数重载通过参数列表区分不同的同名函数;extern关键字能够实现c和c++的相互调用;编译方式决定符号
    的头像 发表于 12-24 17:10 620次阅读

    C++中不一样的重载是什么

    这里想分享C++中一个不一样的重载,即const重载
    的头像 发表于 02-21 14:02 502次阅读
    <b class='flag-5'>C++</b>中不一样的<b class='flag-5'>重载</b>是什么

    Python 重载重写概念

    ,随后不久我便意识到犯下了一个错误。 我们先来看看重载重写概念重载重载的条件如下: 1.一个类里面 2.方法名字相同 3.参数不
    的头像 发表于 11-03 15:13 282次阅读
    Python <b class='flag-5'>重载</b>与<b class='flag-5'>重写</b>的<b class='flag-5'>概念</b>

    java中的重载重写的区别

    Java中的重载(Overload)和重写(Override)是两个重要的面向对象编程概念,尽管它们在使用和功能上有所不同,但它们都与方法和多态性相关。本文将全面介绍重载
    的头像 发表于 11-17 17:13 373次阅读