继承体系下同名成员函数的三种关系

  • 重载
  1. 在同一作用域内
  2. 函数名相同,参数列表不同(分三种情况:参数个数不同,参数类型不同,参数个数和类型都不同)
  3. 返回值类型可以相同也可以不同
  • 重写(覆盖)
  1. 在不同作用域内,分别在父类和子类
  2. 函数名相同,参数列表相同,返回值类型相同,协变除外(下面会介绍什么是协变)
  3. 基类函数必须有virtual关键字修饰
  4. 父子类中函数的访问修饰符可以不同
  • 重定义(隐藏)
  1. 在不同的作用域内,分别是父类和子类
  2. 函数名相同
  3. 在基类和派生类中只要不构成重写的都是重定义

重载

C++中函数重载达到的效果:

调用函数名相同的函数,根据实参的类型和个数选择相应的实现函数体执行。

函数重载是一种静态多态,或者称之为静态联编、静态绑定、静态决议,其实都一样。

重写/覆盖

在子类中定义一个与父类中完全相同的虚函数:

  1. 父类和子类中的虚函数,函数名、参数个数、参数类型以及返回值类型都相同,构成重写。
  2. 子类中的虚函数与父类中的虚函数,函数名、参数个数和类型都相同,只是返回值不同,父类的虚函数返回父类的指针或引用,子类虚函数返回子类的指针或引用,这种情况下也构成重写,我们称之为协变

C++中函数重写达到的效果:

在子类中重写了父类的虚函数,则子类对象调用该重写函数时从子类内部调用,而不是从父类继承,是一种动态多态。

在子类中重写了父类的虚函数,如果用一个父类指针或引用指向子类对象,那么该指针调用的是重写的虚函数,也即是子类的虚函数, 而如果一个父类指针指向父类对象,则调用父类的虚函数。

重定义/隐藏

指的是在不同作用域内,函数名相同,但不构成重写的则构成重定义。不仅仅是指类的成员函数,也可以是类的成员变量。

C++中重定义达到的效果:

对于在父类和子类中有相同名字的成员,子类会将父类成员隐藏,此时无论在子类内部还是外部,通过子类成员对象访问该成员,访问到的都是子类同名成员。

如果在子类内部或外部通过子类成员访问同名成员函数,则需要根据函数调用的规则来调用子类的同名成员函数,否则调用失败。

最新文章

  1. node模块函数图解
  2. SPI总线
  3. VBA控制outlook自动发送邮件(转)
  4. Linux给用户添加sudo权限
  5. unable to open sync connection
  6. Ye.云狐J2刷机笔记 | 完美切换内部存储卡和SD卡的改法.vold.fstab
  7. Hessian
  8. 跨时钟域设计【二】——Fast to slow clock domain
  9. How to create XML validator(验证器;验证程序) from XML schema
  10. Linux入门之——安装虚拟机软件
  11. Java基础:泛型
  12. hdoj:2076
  13. c#中将字符串转换成带2位小数的浮点数
  14. bzoj千题计划211:bzoj1996: [Hnoi2010]chorus 合唱队
  15. LeetCode 545----Boundary of Binary Tree
  16. Git分支管理小结
  17. [BZOJ4554][TJOI2016&&HEOI2016]游戏(匈牙利)
  18. Unity 异步网络方案 IOCP Socket + ThreadSafe Queue
  19. 使用java开源包解析ifc并获取数据(树形结构)
  20. VIM安装YCM插件

热门文章

  1. Day 03 作业
  2. Lua-Async 协程的高级用法
  3. 【CentOS7】常用命令
  4. textarea增加字数监听且高度自适应(兼容IE8)
  5. sql为什么用0,1表示男女?在sql语句里转好还是在页面转好?
  6. 时间轮算法(TimingWheel)是如何实现的?
  7. 《Java知识应用》Java加密方式(MD5)详解
  8. var和let部分浅析
  9. Mongdb可视化工具Studio 3T的使用
  10. Linux 桥接网络不自动分配IP的问题