C++中关于隐藏的理解

引言

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

在父类与子类中,函数名相同,参数不同,无论父类中的同名函数是否含有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(),因为没有此时没有涉及到多态,这里是父类的对象调用的,不是父类的指针,或者引用调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密。

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;小F转载&#xff1a;法纳斯特最近看了新周刊的一篇推送&#xff0c;有…

创建Git仓库的三种形式

创建Git仓库的三种形式&#xff1a; 2种本地创建和远程拉取 文章目录1. 在idea中初始化仓库1.1. 进入目录&#xff0c;初始化仓库1.2. git init 目录名1.3.1 远程拉取1. 在idea中初始化仓库 1.1. 进入目录&#xff0c;初始化仓库 进入目录git init 创建test1目录&#xff0c;…

C++中常用字符串相关的编程题

索引 找出字符串中的数字&#xff0c;字母和符号&#xff0c;并分别存储 找出字符串中所有不重复的字符&#xff0c;并输出 统计字符串中每个字符的个数&#xff0c;并输出 编译环境 以下所用的开发环境是vs2010,创建的都为控制台输出程序。下面只贴出创建项目后修改了的c…

刷了一个半月算法题,我薪资终于Double了

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;前言很多人感觉大公司都是要手写算法&#xff0c;那刷题是必不可少了&#xff0c;你技…

创建版本库

什么是版本库呢&#xff1f;版本库又名仓库&#xff0c;英文名repository&#xff0c;你可以简单理解成一个目录&#xff0c;这个目录里面的所有文件都可以被Git管理起来&#xff0c;每个文件的修改、删除&#xff0c;Git都能跟踪&#xff0c;以便任何时刻都可以追踪历史&#…

mac上用qt调用自己生成的qt动态库,该动态库又依赖第三方库

qt下依赖于第三方库生成的动态库的调用概述基于声网的sdk如何在自己的动态库中使用使用基于第三方库的动态库下面看pro文件中的设置概述 初次使用mac上的qtCreator生成动态库&#xff0c;该动态库编写时调用了第三方库&#xff0c;基于生成的该动态库&#xff0c;编写测试程序…

版本回退

现在&#xff0c;你已经学会了修改文件&#xff0c;然后把修改提交到Git版本库&#xff0c;现在&#xff0c;再练习一次&#xff0c;修改readme.txt文件如下&#xff1a; i am gblfy i am yuxin然后&#xff0c;【工作区】-【暂存区】-【本地仓库】尝试提交&#xff1a; 修改…

Docker精华问答 | 数据库为什么不适合放在 Docker 中运行?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux或Windows 机器上&#xff0c;也可以实现虚拟化。今天就让我们一起看看关于Docker …

Mac下使用macdeployqt打包qt程序:

概述 初次在Mac上使用qt的macdeployqt来打包生成的可执行程序&#xff0c;这里记录下。由于我的程序是调用之前生成的qt动态库&#xff0c;而动态库又依赖于第三方库&#xff0c;相对于没有库文件依赖的程序&#xff0c;这里有一些需要注意的点&#xff0c;下面是打包的步骤。…

路透社:谷歌已停止与华为部分合作;联想否认断供华为PC;微软计划直供Linux内核;谷歌无人机快递Wing进军芬兰……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 阿里巴巴联合欧莱雅发布移动…

管理修改

现在&#xff0c;假定你已经完全掌握了暂存区的概念。下面&#xff0c;我们要讨论的就是&#xff0c;为什么Git比其他版本控制系统设计得优秀&#xff0c;因为Git跟踪并管理的是修改&#xff0c;而非文件。 你会问&#xff0c;什么是修改&#xff1f; 比如你新增了一行&#x…

npm install安装依赖报错——常见报错解决方案

小伙伴在开发前端项目过程中&#xff0c;执行npm install安装项目依赖时&#xff0c;往往会遇到各种各样的报错&#xff0c;接下来建仔给大家总结一下几种常见报错解决方案! 第一种报错&#xff1a;无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 报错详…

AWS CEO Andy Jassy 专访:我们一直思考的是未来 2-5 年的事 | 人物志

戳蓝字“CSDN云计算”关注我们哦&#xff01;人物志&#xff1a;观云、盘点、对话英雄。以云计算风云人物为核心&#xff0c;聚焦个人成长、技术创新、产业发展&#xff0c;还原真实与鲜活&#xff01;本文来源&#xff1a;Siliconangle《Exclusive interview: How CEO Andy Ja…

撤销修改

自然&#xff0c;你是不会犯错的。不过现在是凌晨两点&#xff0c;你正在赶一份工作报告&#xff0c;你在readme.txt中添加了一行&#xff1a; Im writing a report.在你准备提交前&#xff0c;一杯咖啡起了作用&#xff0c;你猛然发现了stupid boss可能会让你丢掉这个月的奖金…

QtCreator下使用c++标准输入cin输出cout没有阻塞等待输入

引言 在QtCreator中编写c程序&#xff0c;其中需要从控制台输入&#xff0c;就用了c的cout和cin&#xff0c;本应该等待控制台输入文本&#xff0c;但是却没有。下面是具体的案例。 案例 本文基于QtCreator创建的qt控制台输出程序&#xff0c;创建时选择如下图所示的选项&am…

Docker 系列学习文章 | 什么是容器云?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;宝哥devops运维转自&#xff1a;云加社区腾小云导读&#xff1a;容器…

删除文件

在Git中&#xff0c;删除也是一个修改操作&#xff0c;我们实战一下&#xff0c;先添加一个新文件test.txt到Git并且提交&#xff1a; echo "test del file" >> test.txt git add test.txt git commit -m "add del test.txt"一般情况下&#xff0c;…

mvc设计模式的简单领悟

引言 mvc设计模式&#xff0c;是将数据模型与视图分离&#xff0c;通过控制器来建立起数据模型与视图之间的联系&#xff0c;当数据模型变化自动更新视图。其中M-数据模型&#xff0c;V-视图&#xff0c;C-控制器。下面是一个简单的对于MVC设计模式的使用。 示例 开发环境是…

添加远程库

现在的情景是&#xff0c;你已经在本地创建了一个Git仓库后&#xff0c;又想在GitHub创建一个Git仓库&#xff0c;并且让这两个仓库进行远程同步&#xff0c;这样&#xff0c;GitHub上的仓库既可以作为备份&#xff0c;又可以让其他人通过该仓库来协作&#xff0c;真是一举多得…

微服务精华问答 | 什么是金丝雀释放?

戳蓝字“CSDN云计算”关注我们哦&#xff01;微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。今天&#xff0c;就让我们来看看关于微服务更加有深度的问题吧。1Q&#xff1a;什么是金丝雀释放&#xff1f;A&#xff1a;Canary Rele…