C++之重载覆盖和隐藏
继承体系下同名成员函数的三种关系
- 重载
- 在同一作用域内
- 函数名相同,参数列表不同(分三种情况:参数个数不同,参数类型不同,参数个数和类型都不同)
- 返回值类型可以相同也可以不同
- 重写(覆盖)
- 在不同作用域内,分别在父类和子类
- 函数名相同,参数列表相同,返回值类型相同,协变除外(下面会介绍什么是协变)
- 基类函数必须有virtual关键字修饰
- 父子类中函数的访问修饰符可以不同
- 重定义(隐藏)
- 在不同的作用域内,分别是父类和子类
- 函数名相同
- 在基类和派生类中只要不构成重写的都是重定义
重载
C++中函数重载达到的效果:
调用函数名相同的函数,根据实参的类型和个数选择相应的实现函数体执行。
函数重载是一种静态多态,或者称之为静态联编、静态绑定、静态决议,其实都一样。
重写/覆盖
在子类中定义一个与父类中完全相同的虚函数:
- 父类和子类中的虚函数,函数名、参数个数、参数类型以及返回值类型都相同,构成重写。
- 子类中的虚函数与父类中的虚函数,函数名、参数个数和类型都相同,只是返回值不同,父类的虚函数返回父类的指针或引用,子类虚函数返回子类的指针或引用,这种情况下也构成重写,我们称之为协变。
C++中函数重写达到的效果:
在子类中重写了父类的虚函数,则子类对象调用该重写函数时从子类内部调用,而不是从父类继承,是一种动态多态。
在子类中重写了父类的虚函数,如果用一个父类指针或引用指向子类对象,那么该指针调用的是重写的虚函数,也即是子类的虚函数, 而如果一个父类指针指向父类对象,则调用父类的虚函数。
重定义/隐藏
指的是在不同作用域内,函数名相同,但不构成重写的则构成重定义。不仅仅是指类的成员函数,也可以是类的成员变量。
C++中重定义达到的效果:
对于在父类和子类中有相同名字的成员,子类会将父类成员隐藏,此时无论在子类内部还是外部,通过子类成员对象访问该成员,访问到的都是子类同名成员。
如果在子类内部或外部通过子类成员访问同名成员函数,则需要根据函数调用的规则来调用子类的同名成员函数,否则调用失败。
C++之重载覆盖和隐藏的更多相关文章
- C++类成员函数的重载、覆盖和隐藏区别?
C++类成员函数的重载.覆盖和隐藏区别? a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆 ...
- C++重载覆盖隐藏
写一个程序,各写出重载覆盖 1 // // main.cpp // 2013-7-17作业2 // // Created by 丁小未 on 13-7-17. // Copyright (c) 201 ...
- java的重载、覆盖和隐藏的区别
重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg ...
- c/c++:重载 覆盖 隐藏 overload override overwrite
http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html 成员函数的重载.覆盖与隐藏成员函数的重载.覆盖(override)与隐藏很容易混 ...
- 【转】c++重载、覆盖、隐藏——理不清的区别
原文网址:http://blog.sina.com.cn/s/blog_492d601f0100jqqm.html 再次把林锐博士的<高质量c++编程指南>翻出来看的时候,再一次的觉得这是 ...
- 【转】重载(overload),覆盖(override),隐藏(hide)的区别
原文网址:http://www.cppblog.com/zgysx/archive/2007/03/12/19662.html 写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖 ...
- c++重载、覆盖和隐藏
看以前的:http://www.cnblogs.com/youxin/p/3305688.html 答案:a.成员函数被重载的特征:overload(1)相同的范围(在同一个类中):(2)函数名字相同 ...
- C++:类成员函数的重载、覆盖和隐藏区别?
#include <iostream> class A { public: void func() { std::cout << "Hello" <& ...
- C++中的重载、覆盖、隐藏
前几天面试时被问及C++中的覆盖.隐藏,概念基本答不上来,只答了怎么用指针实现多态,也还有遗漏.最终不欢而散.回来后在网上查找学习了一番,做了这个总结.其中部分文字借用了别人的博客,望不要见怪.引用的 ...
随机推荐
- 了解web漏洞-sql注入
1:为什么要学web漏洞? 作为一个运维人员,日常工作就是保障服务器和网站的业务正常运行,平时也需要对服务器的安全工作加固,说到防护攻击问题,那么久必须去了解攻击者是怎么对服务器发动的一个流程,这样才 ...
- 阿里最新38道Java面试题解析(MyBatis+消息队列+Redis)
一.谈谈你对 MyBatis 的理解? 1. Mybatis是一个半ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动.创建连接.创建 ...
- Power Platform之Power Automate新增RPA功能
什么是RPA RPA( Robotic Process Automation 机器人流程自动化软件),是一种新型的人工智能的虚拟流程自动化机器人.RPA的核心是通过自动化.智能化技术来“替代人”进 ...
- 开源日志框架Exceptionless使用教程
Exceptionless是一款日志记录框架,它开源.免费.提供管理界面.易于安装和使用.ExceptionLess底层采用ElasticSearch作为日志存储,提供了快速.丰富的查询API,方便我 ...
- PyTorch-网络的创建,预训练模型的加载
本文是PyTorch使用过程中的的一些总结,有以下内容: 构建网络模型的方法 网络层的遍历 各层参数的遍历 模型的保存与加载 从预训练模型为网络参数赋值 主要涉及到以下函数的使用 add_module ...
- C#线程学习笔记六:线程同步--信号量和互斥体
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Mutex_And_Semaphore.html,记录一下学习过程以备后续查用. ...
- mysql-magic 从dump中获取MySQL的明文密码
项目地址: https://github.com/hc0d3r/mysql-magic 安装: git clone --recurse-submodules https://github.com/hc ...
- supervisor 相关命令
今天重新使用 supervisor 相关命令的时候,发现已经忘了,下面重新进行记录一下,进行备忘: supervisorctl restart <application name> ; 重 ...
- Django的Form验证(2)
Django的Form验证(2) Form的含义及作用: 用于验证用户请求数据合法性的一个组件(校验数据的合法性) Django的Form实现步骤: 创建一个验证用户请求的模板 from django ...
- keycloak搭配mysql
下载 https://www.keycloak.org/downloads.html 到这里下载最新的服务器版本,本次文章指定版本为: 4.6.0.Final - 发行说明 安装 直接解压缩到某个目录 ...