C++继承(2)——赋值转换、隐藏特性以及作用域

news2025/1/11 7:28:50

目录

一.子类和父类对象的赋值转换

子类对象赋值父类对象的另外两种方式:

总结:

二.父类与子类的作用域

1. 在继承体系中基类和派生类都有独立的作用域。

        例:

2.作用域练习

        练习1:

解决方法:

一.子类和父类对象的赋值转换

先来看一个案例:变量间的赋值

int main(){
	int a;
	double b = 10.22;

	a = b;    //赋值转换
	return 0;
}

        在上面这个代码中,有两个变量a,b,这两个变量类型分别为整型和浮点型,而变量b赋值给变量a,变量b的值10.22在赋值给变量a的过程中,产生一个临时变量,10.22拷贝一份给了临时变量,在这个临时变量中进行类型转换,10.22-->10,然后临时变量的值10再赋值给变量a。 

学习了继承的特性后,我们将通过这个案例看看子类和父类对象的赋值转换过程:

class Person {
public:
	void Print() {
		cout << "Person类对象的成员属性:" << endl;
		cout << _age << endl;
		cout << _name << endl;
		cout << _hight << endl;
		cout << _address << endl;
		cout << endl;
        }
public:
	int _age;
	string _name;
	int _hight;
	string _address="TaiYuan";

};

class Student:public Person{
public:
	int _className;
	string _grade;
};

int main(){
    Person p1;
	p1._name = "小曹";
	p1._age = 21;
	p1._hight = 172;
	p1.Print();

	Student s1;
	s1._name = "小王";
	s1._age = 22;
	s1._hight = 170;
	s1._grade = "大三";

	//将子类对象的成员值复制给父类对象
	p1 = s1;			
}

        此时p1对象的成员值就是s1的成员值,但p1并不会有Student子类所创_grade,_className成员变量值,在赋值操作中,子类对象只会将它继承过来的成员值重新赋回给父类对象!!!

 

 这就是子类对象对父类对象的赋值转换——支持向上转换,不支持向下转换。

        也就是说父类对象不能赋值给子类对象,因为父类对象中并没有子类对象的_classname、_grade成员值,那它就不能赋!!!

子类对象赋值父类对象的另外两种方式:

创建子类对象并将其成员初始化,而父类对象是采用引用的方式进行向上转换 

运行结果: 


运行结果: 

总结:

        子类对象可以赋值给父类的对象、赋给基类的指针、赋给基类的引用。这里有个形象的说法叫“切片”或者“切割”。寓意子类将从父类中继承过来的的那部分成员值切下来赋值给父类对象/指针/引用过去。

二.父类与子类的作用域

1. 在继承体系中基类和派生类都有独立的作用域。

        例:

class Person {
public:
	void Print() {
		cout << "父类的Print函数:" << endl;
		cout << "姓名:" << _name << endl;
		cout << "年龄:" << _age << endl;
		cout << "性别:" << _sex << endl;
		cout << endl;
	                }
	int Add(int age=100) {
		return _age = ++age;
	}
public:
	int _age=26;
	string _name="王丽";
	string _sex="女";
};

class Student :public Person {
public:
	void Print() {
		cout << "子类的Print函数:" << endl;
		cout << "学号:" << _id << endl;
		cout << "性别:" << _sex << endl;
		cout << "班级:" << _ClassName << endl;
		cout << endl;
	            }
public:
	int _id=202001;
	string _ClassName="优秀2班";
	string _sex="男";
};


int main() {
	Person p;
	p.Print();	
	Student s1;
	s1.Print();	
	
	s1._age = s1.Add();	
	cout << "对象s1的成员变量_age值为:"<<s1._age << endl;

	s1.Person::Print();			

	return 0;
}

代码解析:从上图代码中可知,父类和子类都各有一个Print()成员函数,而且子类对象和父类对象都调用了Print()函数。 

运行结果: 

        从结果我们发现:子类对象和父类对象调用Print()函数时,都调用的是自家类中的Print(),并没有发生子类调用父类Print()函数的情况。 

        那么就可以从中得出一个规律:当在父类和子类中都有同名的函数,且这俩类对象都执行调用这个同名函数时,编译器会优先调用该对象自家类中的同名函数,若该类对象中没有该名称的函数,编译器就会从子类继承过父类中的成员函数中寻找该名称函数。

        想到这是不是有一点点熟悉感,这不就是变量赋值的情况吗?编译器局部优先法,局部没有就去全局找。

测试代码:

以上就是编译器对子类对象调用函数的详细步骤。 

那么又有新的问题了,子类对象就是想调用父类中的Print()函数怎么办?

        一般的方式是行不通的,毕竟子类中的Print()摆在那里,而且对于父类子类的同名函数有个“隐藏”机制,子类会将父类继承过来的成员函数做隐藏操作,也就是说表面上子类只存在一个Print函数,虽然子类有父类的Print,但是被子类给藏起来了,不到万不得已不会用。

       

         若就是想调用父类的Print(),就得在调用前加作用域限定符!

所以隐藏只针对于父类子类都各有一个相同名称的成员函数!!! 


2.作用域练习

        练习1:

class Person {
public:
	void Func() {
		cout << "Func():" << endl;
		cout << endl;
	            }
public:
	int _a;
	string _b;
};

class Student :public Person {
public:
	void Func(int i) {
		cout << "Func(int i)->:" << endl;
        	}
public:
	int _id;
	double _result;
};

int main() {
	Student s2;
	s2.Func();

请问执行代码时会发生什么?

A:造成重载    B:造成重写    C:隐藏/重定义        D:编译出错 

习题解析:

        如上代码可知:Person类的Func函数是无参函数,而子类Student类的Func函数是带参函数
基于此,若s2.Func();编译器默认会优先调用子类本类的Func函数,但是调用时发现,子类的Func函数需要参数带入,而对象s2调用时,并没有传入实参,所以结果:是选C和D:既会发生隐藏情况,又有编译出错。

        总结描述:s2调用的Func()未传参数,导致编译器找不到符合无参的Func函数,报了编译错误,且在此情况中,子类隐藏了从父类继承来的Func()带参函数,也就是说s2想调用的就是从父类继承来的成员函数,但被子类隐藏了,也就调不成,进而出现编译错误。、

解决方法:

    //解决方法1:
	    s2.Person::Func();
	//解决方法2:
	    s2.Func(10);

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

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

相关文章

Reinforcement Learning with Code 【Code 2. Tabular Sarsa】

Reinforcement Learning with Code 【Code 2. Tabular Sarsa】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Rei…

【C# 6.0】云LIS平台源码

基于云计算的区域LIS平台为医疗机构改善患者服务质量提供了强有力的支持&#xff0c;“以患者为核心”这一理念得到了充分实现&#xff0c;可以解决各医院LIS建设水平参差不齐的现状&#xff0c;并完善各医院内LIS系统的功能&#xff0c;实现数据标准统一、功能完善、性能可靠&…

VR全景旅游,智慧文旅发展新趋势!

引言&#xff1a; VR全景旅游正在带领我们踏上一场全新的旅行体验。这种沉浸式的旅行方式&#xff0c;让我们可以足不出户&#xff0c;却又身临其境地感受世界各地的美景。 一&#xff0e;VR全景旅游是什么&#xff1f; VR全景旅游是一种借助虚拟现实技术&#xff0c;让用户…

go env 配置(环境变量)说明

前提&#xff1a;已经安装好 golang 可正确的运行下面这段命令&#xff0c;来查看 go 的配置&#xff1a; go env 输出示例&#xff1a; 以上是我本地(windows)环境下输出的配置信息(环境变量) 我们这次就针对每个配置信息进行一个说明&#xff0c;具体到每个字段是什么意思…

浅谈Vue3 computed计算属性

什么是computed 官方给出的解释&#xff1a;接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象 // 只读 function computed<T>(ge…

远程控制软件安全吗?一文看懂ToDesk、RayLink、TeamViewer、Splashtop相关安全机制

目录 一、前言 二、远程控制中的安全威胁 三、国内外远控软件安全机制 【ToDesk】 【RayLink】 【Teamviewer】 【Splashtop】 四、安全远控预防 一、前言 近期&#xff0c;远程控制话题再一次引起关注。 据相关新闻报道&#xff0c;不少不法分子利用远程控制软件实施网络诈骗&…

直播预告 | 开源运维工具使用现状以及可持续产品的思考

运维平台自上世纪90年代开始进入中国市场&#xff0c;曾形成以传统四大外企&#xff1a;IBM、BMC、CA、HP为代表的头部厂商&#xff0c;还有一众从网管起家的国内厂商。2010年前后&#xff0c;出现了以Zabbix、Nagios、Cacti为代表的开源工具&#xff0c;后来又陆续出现了Prome…

如何计算文本的困惑度perplexity(ppl)

前言 本文关注在Pytorch中如何计算困惑度&#xff08;ppl&#xff09;为什么能用模型 loss 代表 ppl 如何计算 当给定一个分词后的序列 X ( x 0 , x 1 , … , x t ) X (x_0, x_1, \dots,x_t) X(x0​,x1​,…,xt​), ppl 计算公式为&#xff1a; 其中 p θ ( x i ∣ x &l…

Ansible之playbook剧本编写

一、playbook的相关知识 1.playbook简介 playbook是 一个不同于使用Ansible命令行执行方式的模式&#xff0c;其功能更强大灵活。简单来说&#xff0c;playbook是一个非常简单的配置管理和多主机部署系统&#xff0c;不同于任何已经存在的模式&#xff0c;可作为一个适合部署复…

3.5千伏硅化碳(SiC)深埋式超结二极管

目录 相关知识研究了什么文章创新点研究方法文章的结论 相关知识 在科学和工程技术领域&#xff0c;SEM通常是扫描电子显微镜&#xff08;Scanning Electron Microscope&#xff09;的缩写。因此&#xff0c;在 “外延SEM横截面图” 中&#xff0c;SEM指的是扫描电子显微镜&am…

分享一些精选的开源框架与代码!

今天主要是收集并精选了一些自己所了解和学习过的优秀的嵌入式开源框架代码和项目&#xff0c;不太了解的就不推荐给大家了&#xff0c;因为开源的东西实在是太多了&#xff0c;鱼龙混杂&#xff0c;所以取其精华去其糟粕是迫在眉睫的大事~ 当然也不要总是沉浸在开源的东西之中…

手把手教你Pytest+Allure2.X定制报告详细教程,给自己的项目量身打造一套测试报告-02(非常详细)

简介 俗话说“人靠衣服马靠鞍”一个项目做的在好&#xff0c;没有一分的漂亮的测试报告有时候也是很难在客户那边验收的&#xff0c;今天就带你们解决这一难题。 前边一篇文章是分享如何搭建pytestAllure的环境&#xff0c;从而生成一份精美的、让人耳目一新的测试报告&#…

【Linux 网络】 HTTPS协议原理 对称加密 非对称加密 数字证书

HTTPS协议 HTTPS协议和HTTP协议的区别什么是“加密” 和“解密”加密和解密的小故事 为什么要进行加密&#xff1f;臭名昭著的“运营商劫持”事件 常见加密方式对称加密非对称加密 数据摘要数字签名 HTTPS工作过程探究方案 1 &#xff1a; 只使用对称加密方案2 &#xff1a; 只…

微信小程序交易体验分常见问题指引

小程序交易体验分是为保障小程序用户的交易体验&#xff0c;促进开发者向用户提供更好的服务&#xff0c;帮助开发者更好的评估自身服务水平的机制。平台将对开发者在其小程序的违规行为进行判定&#xff0c;根据违规行为的严重程度对该小程序扣减不同分值的交易体验分&#xf…

Excel快捷键F1-F9详解:掌握实用快捷操作,提升工作效率

Excel是广泛应用于办公场景的优质电子表格软件&#xff0c;然而&#xff0c;许多人只是使用鼠标点击菜单和工具栏来完成操作&#xff0c;而忽略了快捷键的威力。在本文中&#xff0c;我们将详解Excel中的F1-F9快捷键&#xff0c;帮助您掌握实用的快捷操作&#xff0c;提升工作效…

多组学背景下的基因调控网络推断

染色质、转录因子和基因之间的相互作用产生了复杂的调节回路&#xff0c;可以表示为基因调节网络&#xff08;GRNs&#xff09;。GRNs的研究有助于了解疾病中细胞身份是如何建立、维持和破坏的。GRN可以从实验数据——历史上的大量组学数据——或文献中推断出来。单细胞多组学技…

图形化分析工具

1.图形化之短距分析 2.图形化之温度、CPU频率分析 3.常用指令集合 4.常见fastboot指令集合 5.模块之自动化分析–此项功能需要后续不断完善

再下一城丨美格智能座舱模组获头部新势力正式定点

近日&#xff0c;美格智能与国内领先的Tier1厂商密切协作&#xff0c;基于美格车载智能模组打造的智能座舱解决方案&#xff0c;成功获得国内某头部造车新势力的座舱域控制器项目定点&#xff0c;为其打造下一代智能座舱解决方案&#xff0c;创造更加沉浸和智能的座舱体验。 据…

C# Blazor 学习笔记(1):Blazor基础语法,组件化和生命周期

文章目录 前言基础语法路由Page 页面元素条件生成if / elseforforeach 绑定参数绑定(双向)事件绑定字典绑定 attributes 组件化如何使用Parameter 参数注入使用回调函数组件声明回调组件注入回调组件触发回调 直接控制 ref 生命周期App起始阶段&#xff1a;生命周期钩子阶段&am…

【产品文档】产品测试报告模板

今天和大家免费分享产品测试报告的文档模板。产品测试文档是在软件开发或产品开发过程中所编制的文件&#xff0c;用于记录测试计划、测试用例、测试结果和其他与产品测试相关的信息。它是测试团队或测试人员的重要工具&#xff0c;用于指导和管理测试过程&#xff0c;并与开发…