C++——继承(2)详解

news2024/11/17 3:42:11

目录

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

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

总结:

二.父类与子类的作用域

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/814591.html

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

相关文章

深入理解Java类加载机制中的双亲委派模型--根据源码探讨

前言&#xff1a; 今天和大家探讨一道Java中经典的面试题&#xff0c;这道面试题经常出现在各个公司的面试中&#xff0c;本篇文章主要讲解ava类加载机制中的双亲委派模型的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大…

Cesium态势标绘专题-三角旗标、矩形旗标、曲线旗标(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

前端JavaScript作用域详解

目录 前言 什么是作用域 作用域类型 全局作用域 局部作用域 块级作用域 ES6之前 ES6以后 作用域链 变量提升 基础概念 优先级问题 闭包 定义 特点 使用场景 封装私有变量 延长变量周期 模块化、命名空间 缓存 ES6的作用域 const、let 块级作用域 变量提…

tinymce4/5实现将word中内容(文字图片等)直接粘贴至编辑器中——利用插件tinymce-powerpaste-plugin

TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有&#xff1a;UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势&#xff1a; 开源可商用&#xff0c;基于LGPL2.1 插件丰富&#xff0c;自带插件基本涵盖日常…

关于时序图

时序图 01 什么是时序图&#xff1f;02 时序图的组成元素2.1 对象2.2 生命线2.3 消息 03 如何绘制 01 什么是时序图&#xff1f; 时序图是UML交互图中的一类&#xff0c;又名序列图、顺序图。 用于描述对象之间的传递消息的时间顺序&#xff08;包括发送消息、接收消息、处理…

一个女程序员的成长之路

2013年大学毕业了&#xff0c;带着迷茫与好玩&#xff0c;我还年轻的心态&#xff0c;开始在郑州寻觅工作机会&#xff0c;最后很荣幸的在一家小公司入职了&#xff0c;工作的内容是给种植大棚的用户打电话&#xff0c;推销农药。每天就是在网上各种农业平台上面找号码&#xf…

ASIC-WORLD Verilog(11)过程时序控制

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加了自己的理解&#xff09;分享给大家。 这是网站原文&…

【vue】vue中Mixins的用法(jeecg-boot为例):

文章目录 一、jeecg-boot本身只有JeecgListMixin.js二、使用Mixin:三、mixins详解&#xff1a;【1】由于每个项目的接口和参数不同>这里引进js进行处理&#xff0c;不在Mixin里面处理了&#xff08;Mixin只做公共数据处理&#xff09;【2】公共的页面字典【3】解决方法里面不…

2009年上半年 软件设计师 上午试卷3

●下图属于UML 中的&#xff08;46),其中&#xff0c;AccountManagement 需要&#xff08;47)。 (46)A.组件图 B.部署图 C.类图 D.对象图 (47)A.实现 IdentityVerifier 接口并被 CreditCardServices 调用 B.调用 CreditCardServices 实现的 Identity Verifier 接口 C.实现 I…

设计模式大白话——装饰者模式

装饰者模式 文章目录 装饰者模式一、概述二、应用场景三、代码示例四、小结 一、概述 ​ 装饰者模式&#xff0c;此模式最核心之处在于装饰二字&#xff0c;之所以需要装饰&#xff0c;是因为基础的功能无法满足需求&#xff0c;并且装饰是临时的&#xff0c;并不是永久的&…

基于Java+spring+springMvc+mybatis+jsp学生选课管理系统

基于JavaspringspringMvcmybatisjsp学生选课管理系统 一、系统介绍二、功能展示1.课程列表(学生)2.已选课程(学生)3.已修课程(学生)4.我的课程&#xff08;老师&#xff09;5.课程打分&#xff08;老师&#xff09;6.课程管理、学生管理、教师管理&#xff08;系统管理员&#…

python字典:怎么取出key对应的值

目录 python中的字典是什么 怎么判断key是否在字典中 怎么取出key对应的值 总结 python中的字典是什么 在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种无序且可变的数据类型&#xff0c;用于存储键-值&#xff08;Key-Value&#xff09;对。字典通过…

电脑卡顿反应慢怎么处理?提升反应速度的方法

电脑卡顿反应慢是很常见的问题&#xff0c;然而&#xff0c;我们可以采取一些方法来处理这个问题&#xff0c;帮助大家提升电脑反应速度。​ 一、提升电脑反应速度的方法 当电脑运行顺畅时&#xff0c;我们的工作体验也会更加愉悦。然而&#xff0c;如果电脑出现卡顿反应慢的…

【项目设计】MySQL 连接池的设计

目录 &#x1f449;关键技术点&#x1f448;&#x1f449;项目背景&#x1f448;&#x1f449;连接池功能点介绍&#x1f448;&#x1f449;MySQL Server 参数介绍&#x1f448;&#x1f449;功能实现设计&#x1f448;&#x1f449;开发平台选型&#x1f448;&#x1f449;MyS…

【雕爷学编程】MicroPython动手做(24)——掌控板之拓展掌控宝

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

【雕爷学编程】MicroPython动手做(23)——掌控板之WiFi与蓝牙2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

1400*D. Candy Box (easy version)(贪心)

3 10 9 Example input 3 8 1 4 8 4 5 6 3 8 16 2 1 3 3 4 3 4 4 1 3 2 2 2 4 1 1 9 2 2 4 4 4 7 7 7 7 output 题意&#xff1a; n个糖果&#xff0c;分为多个种类&#xff0c;要求尽可能的多选&#xff0c;并且使得不同种类的数量不能相同。 解析&#xff1a; 记录每种糖…

音视频技术开发周刊 | 304

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 更强的Llama 2开源&#xff0c;可直接商用&#xff1a;一夜之间&#xff0c;大模型格局变了 Meta 终于发布了大家期待已久的免费可商用版本 Llama 2。 6000份问卷透露出AI…

Java生成二维码——附Utils工具类

参加2023年的计算机设计大赛国赛&#xff0c;拿到了一等奖。 现在将项目中的工具类代码剥离出来&#xff0c;方便之后项目开发中复用。 实现效果&#xff1a; 代码实现&#xff1a; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import c…

挑战双面侧柱碰试验:比亚迪CTB保障高品质出行

对于用户来说&#xff0c;选择汽车时最应该重视的要素是什么&#xff1f; 第一&#xff0c;是安全&#xff1b;第二&#xff0c;是安全&#xff1b;第三&#xff0c;还是安全&#xff01; 那么作为新能源汽车的代表&#xff0c;比亚迪在保障驾乘人员的安全方面又是怎样做的呢&a…