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.hqwc.cn/news/459214.html

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

相关文章

mac电脑上使用android studio创建flutter项目

mac电脑环境配置可以看这篇文章:https://xiaoshen.blog.csdn.net/article/details/136068650 配置玩环境之后,开始创建第一个flutter项目:点击new flutter project或者new project都可以 然后选择flutter: 并将sdk配置为解压后的…

xss 盲打使用

使用beef等内网xss平台,或外网xss平台(XSS平台-仅用于xss安全测试专用、XSS平台 - (支持http/https)XSS Platform) 将生成的js脚本写到网站的留言框处,但对应的用户(尤其是admin)查看留言,就会…

蓝桥杯每日一解

可以看看a的ascii码为6532 而A为ascii码为65&#xff0c;大小写相差32位 #include <iostream>using namespace std; int main(){int n;cin >> n;char a;for (int i 1;i<n;i){while(scanf("%c",&a) ! EOF){//无限输入直到输入到空格if(a a || a …

ubuntu远程桌面配置以及常见问题

ubuntu桌面系统配置 ubuntu远程桌面配置如下 第一步&#xff0c;安装xrdp sudo apt-get isntall xrdp安装完检查一下服务是否可以正常启动&#xff0c; sudo systemctl status xrdp如果看到active应该就正常启动了 第二步&#xff0c;开启Ubuntu桌面共享 好接下来我们测试一…

Windows 安装 MySQL 最新最简教程

Windows 安装 MySQL 最新最简教程 官网地址 https://dev.mysql.com/downloads/mysql/下载 MySQL zip 文件 配置 MySQL1、解压文件 2、进入 bin 目录 搜索栏输入 cmd 回车进入命令行 C:\Users\zhong\Desktop\MySQL\mysql-8.3.0-winx64\mysql-8.3.0-winx64\bin 注意这里是你自己…

创建一个VUE项目(vue2和vue3)

背景&#xff1a;电脑已经安装完vue2和vue3环境 一台Mac同时安装vue2和vue3 https://blog.csdn.net/c103363/article/details/136059783 创建vue2项目 vue init webpack "项目名称"创建vue3项目 vue create "项目名称"

FlinkSql 窗口函数

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

微信小程序新手入门教程四:样式设计

WXSS (WeiXin Style Sheets)是一套样式语言&#xff0c;用于描述 WXML 的组件样式&#xff0c;决定了 WXML 的组件会怎么显示。 WXSS 具有 CSS 大部分特性&#xff0c;同时为了更适合开发微信小程序&#xff0c;WXSS 对 CSS 进行了扩充以及修改。与 CSS 相比&#xff0c;WXSS …

spring boot和spring cloud项目中配置文件application和bootstrap中的值与对应的配置类绑定处理

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136065211 加载完文件转换为 Environment 中对应的值之后&#xff0c;接下来需要将对应的值与对应的配置类进行绑定&#xff0c;方便对应的组件取值处理接下来的操作。 对应的配置值与配置类绑定通过 Con…

Map 集合

Map集合 1. 概述2. 方法3. 代码示例4. 输出结果5. 注意事项 实现类&#xff1a; HashTable、HashMap、TreeMap、Properties、LinkedHashMap 其他集合类 具体信息请查看 API 帮助文档 1. 概述 Map是Java中的一种数据结构&#xff0c;用于存储键值对&#xff08;key-value pair&…

Java外卖小程序管理系统

技术架构&#xff1a; springboot ssm mysql redis 有需要该项目的小伙伴可以私信我你的Q。 功能描述&#xff1a; 商品管理&#xff1a;新增商品、所有商品 菜单管理&#xff1a;菜单管理、菜单分类 订单管理&#xff1a;订单总览&#xff08;包括未付款、已付款、已…

D音等短视频为什么这么吸引人?长期沉迷刷D音的危害 彻底戒掉刷D音上瘾 占用大量时间 注意力分散 思维浅薄 焦虑、抑郁 干扰睡眠 视力疲劳

这是你吗&#xff1f; 人生最爽的事是&#xff1a;刷痘印。 人生最不爽的事是&#xff1a;刷完&#xff0c;什么也没有得到&#xff0c;事也没做。 吸引法则 1. 内容碎片化&#xff0c;符合快节奏时代需求 短视频的时长通常只有几秒到十几分钟&#xff0c;内容简短精悍&…