引言

在使用中弄清楚隐藏的区别之后,还需要明白怎么使用。下面说以下隐藏,重写,重载的区别:
与重载的区别:

在父类与子类中,函数名相同,参数不同,无论父类中的同名函数是否含有virtual关键字,都是隐藏;

与重写的区别:

在父类和子类中,函数名相同,参数相同,父类中的同名函数没有virtual关键字,为隐藏。

示例

下面举例说明:

class Base
{public:void funA(){cout<<"funA()"<<endl;}virtual void funB(){cout<<"funB()"<<endl;}
};class Heri:public Base
{public:void funA(){cout<<"funA():Heri"<<endl;}void funA(int a){cout<<"funA(int a):heri"<<a<<endl;}void funB(){cout<<"funB():heri"<<endl;}
};

以上示例中,基类中的函数funA()与派生类中的函数funA()之间是隐藏,其函数名相同,参数相同,存在于派生类于子类中,且基类中的funA()函数前没有virtual关键字,故为隐藏。基类的函数funA()与派生类中的函数funA(int a)函数名相同,参数不同,存在于基类和派生类中,无论基类有没有关键字virtual两个函数之间也是隐藏,基类函数funB()与派生类函数funB()之间是重写,又叫覆盖,当重写发生的情况下,父类的指针或引用指向子类的对象,通过父类的指针或引用调用父子类中被重写的函数,实际上调用的是子类的函数,这个具体得理解虚函数,多态这块,这里不再提及。以上是对函数之间关系的一种分析,接下来应该看看如何使用隐藏,隐藏使用的时候记住一句,派生类的指针或引用,对象调用子类和父类同名的函数,父类的同名函数被子类隐藏,调用的是子类的函数,当然这句话是针对于隐藏关系的函数的而言。接下来看如何应用。

隐藏的应用

下面是一个小程序,上代码:

// hideDemo.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <iostream>
#include <stdlib.h>using namespace std;class Base
{public:void fun1(){cout<<"base:fun1()"<<endl;fun();}virtual void fun(){cout<<"base:fun()"<<endl;}
};class Deriverd:public Base
{public:virtual void fun1(){cout<<"deriverd:fun1()"<<endl;}void fun(){cout<<"deriverd:fun()"<<endl;}
};int _tmain(int argc, _TCHAR* argv[])
{Base *pb = new Deriverd;pb->fun1();system("pause");return 0;
}

上面是一个小程序,输出结果为:

之所以输出是上面的结果是因为main函数中创建了父类的指针指向了子类的对象,然后通过父类的指针调用具有隐藏关系的fun1()函数,该函数在使用时记住一句“派生类的指针,引用,对象调用父类或者派生类中的同名函数,调用的是子类的函数”,这句话一听就会被误解,pb->fun1();以为调用的是子类的函数fun1(),实际并不是,上句话有一个前提,是派生类的对象或引用,指针进行调用,而这里是父类的指针调用,这样的解释过于牵强,我总结出的经验就是,隐藏关系的函数,谁调用就用谁的函数,按照正常的函数调用使用便可得正确的结果,这里是父类指针调用,就用父类的函数fun1().当然这只适用于作答,真正的理解还得从书上给出的解释入手。

巩固

下面基于上面的理解,看看下面的程序:

// hideDemo.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <iostream>
#include <stdlib.h>using namespace std;class Base
{public:void fun1(){cout<<"base:fun1()"<<endl;fun();}virtual void fun(){cout<<"base:fun()"<<endl;}
};class Deriverd:public Base
{public:virtual void fun1(){cout<<"deriverd:fun1()"<<endl;}void fun(){cout<<"deriverd:fun()"<<endl;}
};int _tmain(int argc, _TCHAR* argv[])
{Base *pb = new Deriverd;pb->fun1();Deriverd de;de.fun1();Base b;b.fun1();system("pause");return 0;
}

输出结果:

定义派生类对象Deriverd de;通过派生类对象调用fun1(),这里调用的是派生类自己的函数fun1(),应了那句“派生类的对象,指针,引用调用派生类和基类的同名函数,调用的是派生类的函数,父类的函数被隐藏”,定义基类对象 Base b;通过对象b调用函数fun1(), 调用的是基类的函数fun1().然后在fun1()中输出base:fun1(),接着调用函数fun(),这里的函数fun()调用的是基类自身的函数fun(),因为没有此时没有涉及到多态,这里是父类的对象调用的,不是父类的指针,或者引用调用。

C++中关于隐藏的理解相关推荐

  1. 对网络中安全审计产品的理解

    对网络中安全审计产品的理解<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  2. CTF中遇到不知道文件类型_AE中你不知道的隐藏功能-Mask与特效

    AE中你不知道的隐藏功能-Mask与特效 "没关系"就是有关系,形容事情的好坏的顺序是很棒.很好.还行.不行.太糟了.没关系. - <破产姐妹> 我们平时理解的Mask ...

  3. .net 本地文件管理 代码_如何在百万行代码中发现隐藏的后门

    试想一下,如果你的网站被入侵,攻击者留下隐藏的后门,你真的都可以找出来嘛?面对一个大中型的应用系统,数以百万级的代码行,是不可能做到每个文件每段代码进行手工检查的. 即使是一款拥有99.9%的Webs ...

  4. transformer中QKV的通俗理解(渣男与备胎的故事)

    transformer中QKV的通俗理解(渣男与备胎的故事) 用vit的时候读了一下transformer的思想,前几天面试结束之后发现对QKV又有点忘记了, 写一篇文章来记录一下 参考链接: 哔哩哔 ...

  5. 黑暗危害:基于学习,大规模发现Android应用中的隐藏敏感操作(HSO)

    黑暗危害:基于学习,大规模发现Android应用中的隐藏敏感操作(HSO) 摘要 隐藏敏感操作(HSO),例如:在接收SMS消息时窃取隐私用户数据正越来越多地被移动恶意软件和其他潜在危害应用(PHA) ...

  6. python运用在大数据中精准生活_在大数据中精准生活阅读理解答案

    在大数据中精准生活阅读理解答案 ①万物皆互联,无处不计算.因为互联网.手机.无线传感器的普及,实时监测.远程协作.SOHO工作.数据管理已成为平常之事,信息像水电一样通过网络供应汩汩传输,计算机上有形 ...

  7. 报表中利用隐藏列对扩展格显示值求和

    在润乾报表中,获取报表中单元格显示值的函数是disp(),然而这个函数却无法计算扩展单元格的显示值.从而无法直接对扩展个显示值求和. 在下图中,需要计算D3单元格的显示值之和. D3值为:ds1.再订 ...

  8. ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解

    转自 ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解 ArcGIS Engine中总调用IFeatureClass ...

  9. KMP中next数组的理解

    next数组是KMP的核心,但对于next数组我们总是有时候感觉明白了,但有时候又感觉没明白,现在我就说下我自己对KMP中next数组的理解,首先next[i]上的数字的意义,next[i]表示的是当 ...

最新文章

  1. python运行程序-用Python执行程序的4种方式,编程必备
  2. Android PorterDuff.Mode
  3. Oracle 高水位问题
  4. c语言常量x,C语言的数据、常量和变量
  5. 最近在ST公司的STxp70的dsp平台上开发音频codec模块.
  6. 简单理解线性规划的单纯形算法
  7. nginx 日志配置_Nginx记录日志到systemd journal
  8. java获取泛型的类型_Java反射获取泛型类型
  9. Log4jx 2.9 后支持进程号输出
  10. Julia :关于函数返回类型::
  11. 目标规划运筹学例题doc_第八章 运筹学 目标规划 案例.doc
  12. 自己设计过App的数据库框架?还是只是停留在使用ormlite greenDao这类框架,一篇文章帮你解答
  13. termux安装java,android下的termux模拟器安装openJDK和运行springboot项目
  14. 如何缩小jpg图片大小?jpg格式怎么压缩?
  15. 计算机科学之父——图灵
  16. 【已解决】ModuleNotFoundError: No module named ‘snmp_cmds‘ 缺少snmp-cmds包
  17. ventoy集成微PE+优启通;vmware虚拟机如何进入PE系统,ventoy启动盘制作。
  18. PyQt5 登陆界面
  19. oceanbase安装记录
  20. 3.5 函数的极值与最大值和最小值

热门文章

  1. Dubbo-go 优雅上下线设计与实践
  2. 巧用 Img / JavaScript 采集页面数据
  3. Apache RocketMQ在我司的最佳实践--智慧政务场景下的分布式消息与分布式事务
  4. 在 Kubernetes 集群中使用 MetalLB 作为 Load Balancer(上)
  5. C-Power 自主无人海上电力系统有望通过高效能源传输及远程高带宽通信技术,开启新的海上应用
  6. MongoDB+阿里云 最新数据库独家上线!
  7. 你家的饮水机,到底可以有多脏?
  8. 华为发布智简全光网战略,携手上下游重新定义光产业
  9. Cloud一分钟 | 一脚踏入云计算2.0时代,京东云这回拼的是“朋友 圈”;8400万元私有云招标...
  10. 还在用 Python 2.x?Python 3.7.0 正式发布!