c++语言之覆盖与隐藏

解析C++隐藏与覆盖 在学习C++的继承与多态过程中我们接触到了隐藏与覆盖的概念,那么隐藏和覆盖分别做了些什么? 在C++的继承中我们知道派生类可以继承基类的成员变量和成员函数,那么当派生类继承基类的成员变量和成员函数时自己也有同名的成员变量和同名且同参数列表的成员函数时是如何处理的呢? 遇到这类情况C++的处理方式为隐藏和覆盖,下面就来介绍隐藏和覆盖。 隐藏 派生类将继承的基类的同名的成员变量和成员方法隐... 阅读详情

我们知道派生类可以继承基类的成员变量和成员函数,如果在派生类定义同名的函数,即使参数不同,也会隐藏基类的继承来的函数。通过基类的引用或指针,可以实现函数的动态绑定,当然函数必须指定为虚函数。

下面摘自《c++高质量编程指南》对覆盖,隐藏的解释。

覆盖是指派生类函数覆盖基类函数,特征是:

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

(2) 函数名字相同;

(3) 参数相同;

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

这里“隐藏”是指派生类的函数屏蔽了与其同名的基类函数, 规则如下:

(1) 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

下面通过例子来理解函数的覆盖,隐藏。

#include <iostream>

using namespace std;

 

class B

{

public:

       void f()

       {

              cout<<"Base::f()"<<endl;

       }

       virtual void g()

       {

              cout<<"Base::g()"<<endl;

       }

 

};

 

class D:public B

{

public:

       void f()

       {

              cout<<"Derived::f()"<<endl;

       }

       virtual void g()

       {

              cout<<"Derived::g()"<<endl;

       }

};

 

int main()

{

       B b;

       D d;

       b.f();

       d.f();

       b.g();

       d.g();

 

       B* pb1 = &b;

       B* pb2 = &d;

       pb1->f();

       pb2->f();

       pb1->g();

       pb2->g();

 

       B& b1 = b;

       B& b2 = d;

       b1.f();

       b2.f();

       b1.g();

       b2.g();

       return 0;

}

例子通过三种方式调用函数f(),g(),原对象名、指针和引用。

第一种方式最简单,输出为

Base::f()

Derived::f()

Base::g()

Derived::g()

第二种方式为指针方式,f函数不是虚函数,不能动态绑定,g函数是虚函数,能动态绑定,输出为

Base::f()

Base::f()

Base::g()

Derived::g()

第二种方式为引用方式,其实和指针绑定一样,f函数不是虚函数,不能动态绑定,g函数是虚函数,能动态绑定,输出为

Base::f()

Base::f()

Base::g()

Derived::g()

下面我们修改一下类D的内容,如下:

class D:public B

{

public:

       void f(int i)

       {

              cout<<"Derived::f()"<<endl;

       }

       virtual void g()

       {

              cout<<"Derived::g()"<<endl;

       }

};

然后考虑,

       D* pb3 = &d;

       pb3->f();

想调用基类的f函数,会输出什么呢?

结果是编译错误,因为派生类重写了f函数,隐藏了基类的函数,如过非要调用基类的,可以在派生类中写个重载函数如下,一般情况下在派生类中函数名字尽量不要和基类函数名相同。

class D:public B

{

public:

       void f(int i)

       {

              cout<<"Derived::f()"<<endl;

       }

       void f()

       {

              B::f();

       }

       virtual void g()

       {

              cout<<"Derived::g()"<<endl;

       }

};

另外虚函数的默认参数是编译时确定的,即通过基类的指针或引用调用虚函数时,默认参数为在基类中指定的值。

关于动态绑定和静态绑定,下面这篇文章讲的很好。

http://blog.youkuaiyun.com/chgaowei/archive/2011/05/17/6427731.aspx

 

 

Axure RP 9在Windows 11环境下的高效安装与配置指南 本文提供Axure RP 9在Windows 11系统下的详细安装步骤与配置指南。针对Win11安全特性,从获取官方安装资源、调整系统权限,到定制化安装路径、精准汉化及性能优化,系统性地解决了安装闪退、汉化失败、运行卡顿等常见问题,确保用户获得稳定流畅的原型设计体验。 阅读详情

相关推荐

Excel曲线拟合实战:从基础趋势线到高级回归分析

本文系统介绍了Excel曲线拟合的完整工作流,从基础的散点图与趋势线应用,到利用Solver插件进行自定义高级回归分析。文章详细讲解了线性、多项式、指数、对数等六大常用数学模型的适用场景与选择方法,并强调了通过R²值、残差图评估拟合效果、避免过拟合与外推风险的关键步骤,帮助读者掌握从数据探索到预测评估的实战技能。

weixin_29280219的博客 532

C++中的覆盖与隐藏(详细讲解)

https://www.cnblogs.com/cdp1591652208/p/7748546.html C++类中覆盖与隐藏一直是一个容易理解出错的地方,接下来我就详细讲解一下区别在何处 覆盖指的是子类覆盖父类函数(被覆盖),特征是: 1.分别位于子类和父类中 2.函数名字与参数都相同 3.父类的函数是虚函数(virtual) 隐藏指的是子类隐藏了父类的函数(还存在),具有以下...

Young's Blog 670

Nacos漏洞利用工具V3.0.5实战:从认证绕开到内存马植入的全流程指南

本文详细解析了Nacos漏洞利用工具V3.0.5在实战中的应用,从认证绕开到内存马植入的全流程。文章深入探讨了如何利用Nacos的历史漏洞,如默认口令、认证逻辑绕过、Derby SQL注入及Jraft反序列化,实现权限提升与持久化控制,并提供了防御视角与加固建议,旨在帮助安全人员理解攻击链以加强防护。

h6j7k8l9p0的博客 483

C/C++ 知识点:重载、覆盖和隐藏

函数重载允许在同一作用域内声明多个同名但参数列表不同的函数的特性,是C++实现静态多态(编译期)的形式。这里的参数列表不同,可以是指参数的数量不同、参数的类型不同,或者参数的顺序不同。函数的返回类型并不参与重载的区分。覆盖是指派生类中的成员函数重新定义基类中的虚函数。当派生类中存在一个与基类虚函数同名、参数列表相同且返回类型相同的成员函数时,就发生了覆盖。public:public:void show() override { // 使用override关键字明确表示这是一个覆盖操作。

个人技术博客 1743

sysbench测试系统内存

系统内存读写测试方法,报告解读

m0_61066945的博客 3018

稀疏阵列选型指南:互质阵、嵌套阵、MRA,谁才是你项目里的‘性价比之王’?

本文深入探讨了稀疏阵列技术中的互质阵、嵌套阵和MRA三大架构的工程化选型策略,重点分析了它们在DOA估计、自由度、旁瓣抑制和计算复杂度等核心指标上的表现。通过实际案例和配置示例,为智能天线、声学定位和毫米波雷达等应用场景提供技术选型指南,帮助研发团队在硬件成本与性能之间找到最佳平衡点。

weixin_42525005的博客 488

C++中的覆盖和隐藏

覆盖:子类覆盖父类函数 覆盖的特征是: 分别位于子类和父类中 函数名字和参数都相同 父类的函数是虚函数 virtual 隐藏:子类隐藏了父类函数 隐藏的特征是: 子类的函数与父类的函数名字相同,但是参数不同,父类函数被隐藏 子类的函数与父类的函数名字相同,参数也相同,但是父类没有 virtual,父类被隐藏 总结 IF (子类函数与父类的函数名字相同,但是参数不同)   父类函数被隐藏;...

Solong 739

基于FISCO BCOS 部署可升级的 Solidity存证智能合约

本文介绍了基于FISCOBCOS平台的可升级Solidity存证智能合约实现方案。采用透明代理模式,包含逻辑合约、代理合约和管理合约三部分,支持业务逻辑升级而不影响存储数据。详细阐述了合约架构设计、Solidity代码实现、Go SDK交互流程以及完整的部署升级步骤。方案具有数据持久性、版本兼容性和生产就绪等特点,提供了权限控制、输入验证等安全机制,并包含监控管理工具。该实现为企业级区块链存证应用提供了可靠的基础架构,支持后续功能扩展和定制化开发。

分享AI、区块链技术及应用,未来已来 1513

详细全面讲解C++中重载、隐藏、覆盖的区别

综上所述,函数重载、覆盖和隐藏有着不同的定义、使用场景和特点,正确理解它们之间的区别对于掌握C++的面向对象编程、多态机制以及类之间的函数调用关系等方面有着重要的意义。类中重写后的版本,体现了多态性。函数时,编译器根据传入的实际参数情况来选择匹配的重载函数进行调用。类自身定义的函数,如果要访问基类中被隐藏的同名函数,需要通过。函数有多个重载形式,有的重载函数参数个数不同(如两个。参数的版本),有的重载函数参数类型不同(如。函数时,则分别调用各自类中定义的函数。函数时,编译器会认为是调用。

doubleintfloat的博客 2088

Golang内存管理:GC调优实战案例

在Golang编程中,内存管理是一个非常重要的方面。良好的内存管理可以提高程序的性能和稳定性,而GC(垃圾回收)调优则是优化内存管理的关键手段。本文的目的就是通过实际案例,深入讲解Golang中GC调优的方法和技巧,让读者能够在实际项目中更好地进行内存管理和性能优化。范围涵盖了从核心概念的解释到具体代码实现和调优过程的详细分析。本文首先会介绍一些相关的术语和核心概念,让读者对Golang内存管理和GC有一个基本的认识。然后通过故事引入的方式,更加形象地解释核心概念及其相互关系。

AI Agent Harness Engineering 1118

基于龙虾Claw的会议纪要自动提取与重点内容总结办公场景实践

本文介绍如何使用龙虾Claw构建会议纪要自动提取与重点内容总结系统,实现会议内容的智能处理。

一键难忘的博客 252

Java和C++中的重载,覆盖,隐藏区别

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

Smile&搁浅 1763

【第三方互联】12、支付宝(Alipay)授权第三方登录

我们创建了支付宝开放平台的网页&移动应用,审核通过后,我们需要拿到appid,支付宝公钥,私钥进项开发 一、添加应用信息至项目环境中 我们保存了 appid、应用私钥、支付宝公钥、支付宝回调地址等信息,这里的公钥为支付宝开放平台为我们生成的“支付宝公钥” 二、引入 Maven 依赖 <!-- 支付宝SDK --> <dependency> <g.........

JACKAL 21万+

C++中的重载、覆盖(多态)和隐藏

介绍C++中重载、覆盖和隐藏三个概念。

六轱辘的专栏 764

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java和C++中的重载,覆盖,隐藏

在这首先介绍一下C++中的重载,覆盖和隐藏,再来说说Java的这些规则和C++的区别。 1.成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual关键字可有可无。 2.覆盖是指派生函数覆盖基类函数 (1)不同的范围(分别位于派生类和基类); (2)函数名相同; (3)参数相同; (4)基类函数必须有virtual关键字。 3.这里“

Working... 970

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java的隐藏函数_对比C++与Java中的函数重载、覆盖、和隐藏

在C++中1.函数的重载C++中的函数的重载要求的是 函数名相同 参数列表必须不同 返回值类型可以相同也可以不相同;只有参数列表不相同,在函数调用时,编译环境才能准确抉择调用的是哪个函数。例如:void display();void display(int i);void dispaly(double i);void display(int i,double i);void displa...

weixin_39680609的博客 204

C++父类与子类关系以及函数重载、覆盖和隐藏规则

今天去HTC面试,笔试考了逻辑、c语言、c++语言几个部分,C/C++考的全是基本语法,没有考算法。C语言部分做的还不错,C++部分却做的那么多不确定,其中大部分是C++父子类之间关系以及函数重载、覆盖以及隐藏规则。 在C++语言中,虚函数是非常重要的概念,虚函数是实现C++面向对象中多态性和继承性的基石。而多态性和继承性则是面向对象语言的精髓。掌握虚函数才算是真正掌握C++语言,而C++语言中

清闲老窝的专栏 2万+

c++中的隐藏与java、c#的区别

     上一篇中讲过c++隐藏的情况,可以参考《Effective C++》第50条后部分的内容:     例如,第一次碰到下面这段代码,大部分人会为它发疯:class Base {public: virtual void f(int x);};class Derived: public Base {public: virtual void f(doubl

caomiao2006的专栏 809

浅谈C++重载覆盖隐藏 广州疯狂JAVA

首先,我们得先知道三者的概念。 重载:1)、在相同的范围(同一个类中);2)、函数名字相同;3)、参数不同;4)、virtual关键字可有可无 覆盖:1)、有virtual关键字,在基类函数加声明就行;2)、基类函数与派生类函数一模一样(函数名、参数、返回类型) 隐藏:在调用一个类的成员函数时,编译器会沿着继...

weixin_34023863的博客 80

区分重载(overload),覆盖(Override)和隐藏(hide)

重载overload,这个概念是大家熟知的。在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制就是重载。重载不关心函数的返回值类型,即返回类型不同无法构成重载。此外,C++ 中的const成员函数也可以构成overload。     总结一下重载的特征:   1、处在相同的空间中,即相同的范围内;   2

liuyinghui523的专栏 509

覆盖 多态 重载 隐藏

先介绍下动态绑定,多态性,函数覆盖,这3个概念是一致的,不同的书上有不同的叫法,但是他们的本质是一样的。都体现了面向对象编程语言的一个重要的特点。                   识记关键词:(动态绑定,多态性,函数覆盖),基类,派生类,基类指针(引用),虚函数实现手段:在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一

sooolo的专栏 915

**C++和JAVA中的多态区别以及与此相关的重载、覆盖和隐藏*

* 在C++中: 重载的条件: 同一类中; 函数名称相同; 参数不同,包括个数和类型; virtual可有可无。 覆盖的条件: 派生类—-> 基类; 函数名相同; 参数相同,包括个数和类型; 基类函数有virtual修饰。 隐藏:派生类屏蔽了与其同名的基类函数 如果派生类的函数名和基类相同,但是参数不同,此时无论有无virtual修饰,基类的函数被隐藏; 如果派生类与基类函数名相同,而且参数也完

Hanks-Wang的博客 597

重载、覆盖、多态与函数隐藏(2)

好了,我们先来一个小小的总结重载与覆盖两者之间的特征重载overload的特征:n          相同的范围(在同一个类中);n          函数名相同参数不同;n          virtual 关键字可有可无。 覆盖override是指派生类函数覆盖基类函数,覆盖的特征是:n          不同的范围(分别位于派生类与基类);n     

Yasin Lee 1153

重载 覆盖 隐藏

重载、覆盖与隐藏 1).重载:成员函 重载、覆盖与隐藏 1).重载:成员函数具有以下的特征时发生"重载" A.相同的范围(同一个类中) B.函数的名字相同 C.参数类型不同(不能进行隐式类型转换) D.Virtual关键字可有可无 2).覆盖(也叫"继承"):指派生类函数覆盖基类函数,特征是: A.不同的范围(分别位于基类与派生类中) B.函数名字相同 C.参数相同 D.基

艰难困苦如同欢乐,终将成为人生最后的财富 476

关于C#和C++的重载(Overload)、隐藏(Hide)、覆盖(Override)几个区别比较和得出的疑问...

这里只谈函数(方法)重载,C#独有的属性重载不在讨论之内。 1. Overload: 基本上一致,C#多出了ref、out相关的,C++多出了const(指针和引用时)相关的。 2. Hide: C#引入new; C++一般情况下类似,派生类会按名称隐藏基类的方法除外。(后面提供解释) 3. Override: C#引入override...

weixin_30750335的博客 180

c++与java中继承的区别

c++与java中继承的区别第一点在c++中,重载不会发生在基类与派生类之间!当基类和派生类中存在同名函数时,无论同名函数的形参个数或者类型是否相同,派生类中的同名函数都会将基类中的同名函数隐藏(将在下边说明隐藏)掉,而不会是重载关系。这时,当你通过派生类对象调用该同名函数时,只能访问派生类的该函数,如果硬要访问基类的该函数,则需要在函数名前加上类作用域!如上述代码所示。而在java中子类会将父类中

xinhunhai的专栏 1254

构造函数,析构函数,虚函数,内联函数,静态成员函数,重载,覆盖,隐藏

C++语言特性:构造函数,析构函数,虚函数,内联函数,静态成员函数,重载,覆盖,隐藏 来自:优快云博客推荐文章   |  时间:2012-07-22 14:19:01 原文链接: http://blog.youkuaiyun.com/iamcxl369/article/details/7760188 相关主题: C++ 构造函数 :        1.初始化对象

jfkidear的专栏 1222
上一篇: c/c++笔试题选(一)
下一篇: windows Mobile 6 音频播放探索总结
skilledprogrammer
博客等级 码龄19年 78粉丝 53原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值