c++多态(1) -- 子类型及什么是多态

目录

代码分析: 

代码中我们使用了三种方式:    

为什么子类对象可以赋值给父类对象? 

 

子类型的传递性:  

使用父类的指针指向子类的对象:

总结:   

子类型和多态的联系及什么是多态 

那父类指针指向子类对象的用处在哪? 

子类型:  从名字看就知道和继承有关。

子类型其实就是子类对象可以代替父类对象,赋值给父类的变量。 

使用public继承(必须)的子类对象,可以冒充是父类对象

就是在函数参数需要传入父类时可以传入一个子类

class Father {
public:
	Father(const string& name, int age);
private:
	string name;
	int age;
};

class Son : public Father {
public:
	Son(const string& name, int age, const string& love);
private:
	string love;
};

int main(void) {
	Father f("张三",50);
	Son s("张三儿子", 15, "小美");

	// 第一种
	f = s;
	Father f0 = s;

	// 第二种
	Father* f1 = &s;

   // 第三种
	Father& f2 = s;

	system("pause");

	return 0;
}

Father::Father(const string& name, int age)
{
	this->name = name;
	this->age = age;
}

Son::Son(const string& name, int age, const string& love):Father(name,age)
{
	this->love = love;
}

代码分析: 

代码中我们使用了三种方式:    

1.   使用父类的指针指针指向子类对象。 (常用)

2.   使用将子类赋值给父类的引用。 

3.   直接将子类对象赋值给父类对象。 

这种情况 

为什么子类对象可以赋值给父类对象? 

因为:子类继承自父类,父类中的属性即方法子类其实都有,而且子类还可以再父类的基础上增加新的方法和属性,所以子类中的方法和属性>=父类中,用子类给父类赋值的时候,只需要将子类中多余父类的部分丢弃,赋值它们共有的部分

 

子类型的传递性:  

如果B是A的子类型,C是B的子类型,那么C也是A的子类型。 (但是反过来是错误的) 

使用父类的指针指向子类的对象:

使用父类的指针指向子类的对象。然后我们使用父类的指针局可以访问子类的属性和函数。

至于访问函数的过程我们会在虚函数中说到。现在主要来说一下访问子类的属性。

上面我们使用父类指针指向子类对象,然后使用指针访问name和子类新增的属性love。 

会发现在访问name是输出的是儿子的名字, 访问love的时候编译器报错了  --  报错信息: Father类中不存在love成员。 

如何理解上面这种情况呢?   

可以这样理解,  我们在继承的时候,从父类继承来的属性在内存中是存放在最上面的,所以我们可以理解为,在我们使用父类指针指向子类对象的时候,编译器会使用子类从父类中继承来的属性,使用这些属性的值,初始化一个父类对象,然后让父类指针指向。(仅供理解)  

使用父类指针访问,并且打印数据,和子类中的数值是相同的。而子类中新增的属性,父类中是没有的,所以你使用父类的指针去访问love会出错。 

总结:   

上面一大堆其实就是,父类指针指向子类对象,使用此指针只能访问子类从父类继承或者重写的属性和方法。 子类新增的是无法访问的。 

子类型和多态的联系及什么是多态 

多态:  顾名思义就是多种形态。其实多态的实现就是使用父类指向子类,然后使用父类指针来调用子类的方法。 

举个例子:   我们养了一只猫和一只狗,它们都有吃的功能,但是吃的东西不一样,我们在喂食物的时候,如果是猫我们就喂猫粮,如果是狗我们就需要喂狗粮。同样是吃,但是对于不同的对象,就有不同的实现方式(不同形态),这其实就是多态。 

那父类指针指向子类对象的用处在哪? 

猫和狗共有吃的方法,并且都属于动物类,所以我们可以将吃的方法写在动物类中写上吃的方法,让猫和狗继承这个方法,但是猫和狗吃的又不一样,所以猫和狗重写吃的方法,满足自己的需求。 

我们人喂食其实也是一个功能,也可以分装成一个函数,函数的参数用于传入要喂食的对象,如果我们不使用多态,我们一个吃函数就要写好几个重载,因为你喂猫和喂狗参数是不一样的。但是如果我们使用多态, 也就是父类指针指向子类对象,那么我们使用父类指针就可以直接去访问子类从父类中继承来的方法。

我们让父类(此处就是动物类)的指针或者引用,作为喂食函数的参数,我们无论传入猫对象还是狗对象,我们直接使用父类对象调用吃的方法,会根据指针指向的对象调用其对应的方法,这样我们只使用了一个函数就实现了喂食的功能。 而且以后再养其它的小动物,也不需要新增任何的喂食方法,因为都是动物类的子类,直接使用前面写的喂食方法即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows 版Oracle 数据库(安装)详细过程

首先到官网上去下载oracle64位的安装程序 第一步:将两个datebase文件夹解压到同一目录中。 当下载完成后,它里面是两个文件夹 win64_11gR2_database_1of2, win64_11gR2_database_2of2,我们需要把其中的一个database文件夹整合在一起(复制一个database文件夹到另一…

2024.02.07

总结C类中的继承,虚继承,多态等概念(画思维导图)

政安晨:机器学习快速入门(四){pandas与scikit-learn} {随机森林}

咱们将在这篇文章中使用更复杂的机器学习算法。 随机森林 基本定义 随机森林(Random Forest)是一种机器学习算法,属于集成学习(ensemble learning)的一种。它是通过构建多个决策树(即森林)来进行预测和分类的。 随机森林的主要特点是采用了…

如何配置Pycharm服务器并结合内网穿透工具实现远程开发

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…

Idea Git Review插件

idea git plugin 添加了一些常用的小插件 可以右键打开git bash窗口 可以右键选中文字点击baidu fanyi 可以通过搜索git用户名 指定开始时间查询某个版本自己提交的所有代码文件 可以通过点击蓝色行数,跳转到指定的改动代码块 资源地址: git-pl…

【C语言 - 力扣 - 反转链表】

反转链表题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 题解1-迭代 假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。 在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没…

STM32 新建寄存器版本MDK工程简要步骤

新建工程文件夹 新建一个工程根目录文件夹,并在该文件夹里新建D/M/O/P/U文件夹。 Drivers:存放与硬件相关的驱动层文件Middlewares:存放正点原子提供的中间层组件文件和第三方中间层文件Output:存放工程编译输出文件Projects&am…

前端学习笔记 | HTML5+CSS3静态网页制作的技巧(持续更新)

注:本文的css样式均使用less写法 1、字体居中 (1)先text-align:center;行内元素水平居中 (2)再line-heigh:(盒子高度);行内元素垂直居中 text-align: center;line-height: ( 30 / vw ); 2、盒子居中 情景1&#…

【AIGC风格prompt深度指南】掌握绘画风格关键词,实现艺术模仿的革新实践

[小提琴家]ASCII风格,点,爆炸,光,射线,计算机代码 由冰和水制成的和平标志]非常详细,寒冷,冰冻,大气,照片逼真,流动,16K 胡迪尼模拟火和水&#x…

MySQL数据引擎、建库及账号管理

目录 一、MySQL数据库引擎 1.1.MySQL常见数据库引擎 1.InnoDB(MySQL默认引擎) 2.MyISAM 3.MEMORY(Heap) 1.2.存储引擎查看 二、建库 1.默认数据库介绍 2.建库 3.查看数据库 4.删除数据库 三、账号管理 1.创建用户 1.创建用户并设置登陆密码…

Ryzen Controller 最新版本下载

Ryzen Controller 最新版本下载 GitLab中最新版本地址: Releases Ryzen Controller Team / Ryzen Controller GitLab 然后语言切换成简体中文,就可以愉快使用啦

Springboot多种方法处理静态资源:设置并访问静态资源目录

~目录嗷~ 静态文件application设置方法 配置详解编写配置优缺点 设置配置类方法 配置详解编写配置优缺点 总结 作者:Mintimate 博客:https://www.mintimate.cn Mintimate’s Blog,只为与你分享 静态文件 静态资源&…

FlinkSql 窗口函数

Windowing TVF 以前用的是Grouped Window Functions(分组窗口函数),但是分组窗口函数只支持窗口聚合 现在FlinkSql统一都是用的是Windowing TVFs(窗口表值函数),Windowing TVFs更符合 SQL 标准且更加强大…

uniapp 本地存储的方式

1. uniapp 本地存储的方式 在uniapp开发中,本地存储是一个常见的需求。本地存储可以帮助我们在客户端保存和管理数据,以便在应用程序中进行持久化存储。本文将介绍uniapp中本地存储的几种方式,以及相关的代码示例。 1.1. 介绍 在移动应用开发…

浅谈bypass Etw

文章目录 c#ExecuteAssemblybypass etw c# loader 一种是通过反射找到指定空间的类中method进行Invoke 另一种是通过EntryPoint.Invoke加载 反射加载 Assembly.Load()是从String或AssemblyName类型加载程序集,可以读取字符串形式的程序集 Assembly.LoadFrom()从指定…

elk之倒排索引

写在前面 本文看下es的倒排索引相关内容。 1:正排索引和倒排索引 正排索引就是通过文档id找文档内容,而倒排索引就是通过文档内容找文档id,如下图: 2:倒排索引原理 假定我们有如下的数据: 为了建立倒…

第21讲:动态内存管理

1.为什么要有动态内存分配 2.malloc和free 3.calloc 4.realloc 5.笔试题 6.总结c/c中程序内存区域划分 1.为什么要有动态内存分配 为了调整申请的空间大小,使程序员可以申请和释放空间,提高程序的灵活性 2.malloc和free 作用:分配一块…

安装Pytorch中的torchtext之CUDA版的正确方式

安装Pytorch和torchtext: Previous PyTorch Versions | PyTorch Installing previous versions of PyTorchhttps://pytorch.org/get-started/previous-versions/ 上面的命令如下: pip install torch2.1.2 torchvision0.16.2 torchaudio2.1.2 --index-…

单片机学习笔记---串口通信(2)

目录 串口内部结构 串口相关寄存器 串口控制寄存器SCON SM0和SM1 SM2 REN TB8和RB8 TI和RI 电源控制寄存器PCON SMOD 串口工作方式 方式0 方式0输出: 方式0输入 方式1 方式1输出。 方式1输入 方式2和方式3 方式2和方式3输出: 方式2和…

Nacos(2)

Nacos部署 服务器端docker部署(需要服务器安装好docker) 导入sql文件到服务器编写nacos配置文件custom.env(示例如下,改为自己服务器nacos相关信息) PREFER_HOST_MODEhostname MODEstandalone SPRING_DATASOURCE_PL…