这个讲的有点绕,多看几遍,理解一下,再来总结吧。

函数签名包括函数名和函数参数的个数、顺序以及参数数据类型。

1) 重载

函数重载是指两个函数具有相同的函数名,但是函数参数个数或参数类型不同。函数重载多发生在顶层函数之间或者同一个类中,函数重载不需要构成继承关系。

2) 覆盖

覆盖构成条件和多态构成条件是相同的,覆盖是一种函数间的表现关系,而多态描述的是函数的一种性质,二者所描述的其实是同一种语法现象。

覆盖首先要求有继承关系,其次是要求构成继承关系的两个类中必须具有相同函数签名的成员函数,并且这两个成员函数必须是虚成员函数,具备这两个条件后,派生类中的虚成员函数则会覆盖基类中的同名的虚成员函数。如果我们通过基类指针或引用来调用虚成员函数,则会形成多态。

#include<iostream>
using namespace std;class base
{
public :virtual void vir1(){}virtual void vir2(){}
};class derived : public base
{
public:void vir1(){}void vir2(){}
};int main()
{base * p;p = new derived;p->vir1();p->vir2();delete p;return 0;
}

3) 遮蔽

函数遮蔽同样要求构成继承关系,构成继承关系的两个类中具有相同函数名的函数,如果这两个函数不够成覆盖关系,则就构成了遮蔽关系。遮蔽理解起来很简单,只要派生类与基类中具有相同函数名(注意不是相同函数签名,只需要相同函数名就可以了)并且不构成覆盖关系即为遮蔽。

遮蔽可以分为两种情况,一种是非虚函数之间,另一种则是虚函数之间。我们通过程序示例来分别介绍这两种遮蔽情况。

以上总结了函数名相同的所有情况,函数名相同利用的好可以为程序设计带来较大的便利,使用的不好则容易误导程序设计人员。一般来讲,函数名相同通常会用在以下几种情况中:

  • 顶层函数的函数重载。对于程序设计人员而言,实现功能相同但所处理数据类型不同的函数时,采用函数重载的方式将会带来极大的方便。例如设计一个求绝对值函数,针对整型和double类型各设及一个abs函数,调用时而无需关注参数类型,这样的设计是很方便的。
  • 类中的成员函数的重载,这种函数重载和顶层函数重载同样能给我们的程序带来方便。
  • 类中的构造函数重载,设计多个构造函数,用于不同的初始化对象方式。
  • 在继承层次中为了使用多态特性而采用相同函数签名。

除此之外函数名相同还会导致继承层次中的函数遮蔽,而函数遮蔽这一特性通常会使得程序难以理解,因此建议谨慎使用函数遮蔽机制。

C++重载、覆盖和遮蔽相关推荐

  1. 第九天2017/04/18(3、重载/覆盖 PK 重写/重定义、父类子类混搭风、抽象类)

    1.重载/覆盖 PK 重写/重定义 [预备知识] 函数重载必须在同一个类中发生子类无法重载父类的函数,父类同名的函数将会被名称覆盖重载是在编译期间根据参数类型和个数决定函数调用重载只放在同一个类之中, ...

  2. 韩顺平循序渐进学java 第10.11讲 继承.重载.覆盖

    10.1 继承-四大特征之三 10.1.1 概念 继承可以解决代码复用,让编程更加接近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类(比如刚才的Student),在父类中定 ...

  3. c++ 重载 覆盖 隐藏的区别和执行方式

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

  4. 函数重载 覆盖 隐藏

    重载overload 函数名相同,但形参的个数或形参的类型不同. 仅返回值不同,不能定义为重载函数. class Base { public:void baseFun(int) { cout < ...

  5. 什么是多态 重载 覆盖 继承 最好解释

    多态性是指允许不同类的对象对同一消息作出响应.多态性包括参数化多态性和包含多态性.多态性语言具有灵活.抽象.行为共享.代码共享的优势,很好的解决了应用程序函数同名问题. 多态有两种表现形式:重载和覆盖 ...

  6. java中的几个术语(覆写override,隐藏hiding,重载overload,遮蔽shadowing,遮盖obscuring)

    今天看完<Java Puzzlers>的第八章,里面各种name reuse,章节最后做了一个非常细致的总结! Overriding(覆写) 一个实例方法可以override它的父类中可以 ...

  7. java重载覆盖隐藏_重载,覆盖以及隐藏 - osc_4dki3x9l的个人空间 - OSCHINA - 中文开源技术交流社区...

    重载是指同名函数具有不同的参数表.在同一访问区域内声明的几个具有不同参数列表(参数的类型.个数.顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数.对于重载函数的调用,编译期间确定,是 ...

  8. 问题:1.sizeof;2.重载覆盖隐藏;3.内存管理

    1-1.问:"char a[10]; int len = strlen(a);",len等于多少? 解析:strlen计算从数组a的第一个元素开始到'\0'总共有多少个字符(不包含 ...

  9. Delphi中静态方法重载还是覆盖的讨论

    Delphi中静态方法重载还是覆盖的讨论 新人学习Delphi的时候,容易搞不懂的一个问题,当子类方法和基类方法同名,并且参数也一样的时候,叫做什么呢?是覆盖,还是重载呢? 答案是隐藏父类方法. 一般 ...

最新文章

  1. 创成汇2019年参加创新创业大赛都能获得什么?
  2. Java高并发编程(六):重入锁
  3. Python中的shuffle()函数的使用
  4. php 分布式数据库查询,分布式数据库
  5. 3.8女神节:我又送福利 书和化妆品 男女通吃
  6. [译]编写高性能对垃圾收集友好的代码
  7. 整合mybatis3.2.2跟spring3.0.1
  8. 开课吧Java课堂之PrintWriter类的运用
  9. 在单链表写入一组数据代码_第5章 第1节 链表 - osc_x8s7voop的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. java对获取的字节数组进行处理
  11. Thinkpad x200 X201拆机换风扇教程 实图
  12. RPG Maker MV如何导入dlc素材?
  13. 利用Greenfoot制作简单的小游戏——记忆翻牌游戏(一)
  14. 谷歌学术搜索技巧:查找一个句子的某个空应该用什么词
  15. Peeking inside LuaJIT(窥探LuaJIT)
  16. 0708-/etc/login.defs
  17. [PHP] 新浪企业邮箱登录功能难点梳理
  18. Framework篇 - PackageManagerService 启动分析
  19. 解决CMD命令行窗口不显示颜色问题python
  20. 详解凸优化、图神经网络、强化学习、贝叶斯方法等四大主题

热门文章

  1. Android:主题(Theme)
  2. mvc中循环遍历分配的代码
  3. SQLite的事务和锁
  4. UA MATH563 概率论的数学基础 中心极限定理17 0-1律的应用
  5. 精算模型1 一元生存分析2 参数生存模型
  6. 操作系统任务执行和任务切换的基本实现原理
  7. C# Marshal类基本概念和入门示例程序
  8. Ubuntu安装yum失败-2
  9. 超图数据集管理基本操作 - 隐藏系统字段和添加字段索引
  10. matlab矩阵连接图解