c++(8.28)菱形继承,虚继承,多态,抽象类,模板+Xmind
xmind:
作业:
1.编程题:
以下是一个简单的比喻,将多态概念与生活中的实际情况相联系:
比喻:动物园的讲解员和动物表演
想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有一位讲解员,他会为每种动物表演做简单的介绍。
在这个场景中,我们可以将动物比作是不同的类,而每种动物表演则是类中的函数。而讲解员则是一个基类,他可以根据每种动物的特点和表演,进行相应的介绍。
具体过程如下:
定义一个基类 Animal,其中有一个虚函数 perform(),用于在子类中实现不同的表演行为。
2.用函数模板实现不同数据类型的交换功能。
#include <iostream>using namespace std;class Animal//定义一个基类动物
{
private:
public:virtual void perform()=0;virtual ~Animal(){}
};class Tiger:public Animal
{
public:void perform(){cout << "老虎表演了猛虎下山" <<endl;}
};class Monkey:public Animal
{
public:void perform(){cout << "猴子表演了猴子偷桃" << endl;}
};class Lion:public Animal
{
public:void perform(){cout << "狮子表演了河东狮吼" << endl;}
};
class Elephant:public Animal
{
public:void perform(){cout << "大象表演了喝水" << endl;}
};template <typename T,typename L>
void Exchange (T &a,L &b)//不同数据类型之间的交换
{T temp;temp=a;a=static_cast<T>(b);b=static_cast<L>(temp);
}
//void Exchange(T &a,L &b)
//{
// T temp;
// temp=a;
// a=b;
// b=temp;
//}
int main()
{cout << "==========第一题===========" << endl;Animal *p;Tiger t1;Monkey m1;Lion l1;Elephant e1;cout << "大家请看" <<endl;p = &t1;p -> perform();p = &m1;p -> perform();p = &l1;p -> perform();p = &e1;p -> perform();delete p;p=nullptr;cout << "==========第二题===========" << endl;int a = 98;char b = 'a';cout << a << ' ' << b << endl;Exchange(a,b);cout << (char)a << ' ' << (int)b << endl;return 0;
}

一、菱形继承(家具衍生出沙发和床,沙发床继承沙发和床,形成菱形继承),菱形继承会造成空间浪费
二、虚继承,解决菱形继承空间浪费问题
中间子类的继承方式前 加上 virtual:
#include <iostream>using namespace std;class Jiaju
{
private:string colour;
public:Jiaju(){cout << "家具的无参构造" << endl;};Jiaju(string n):colour(n){ cout << "家具的有参构造" << endl;};
};class Bed:virtual public Jiaju//虚继承
{
private:string name;
public:Bed(){cout << "床的无参构造" << endl;};Bed(string n,string colour):Jiaju(colour),name(n){cout << "床的有参构造" << endl;};
};
class Sofa:virtual public Jiaju//虚继承
{
private:int id;
public:Sofa(){cout << "沙发的无参构造" << endl;};Sofa(int id,string colour):Jiaju(colour),id(id){cout << "沙发的有参构造" << endl;};
};
class SofaBed:public Sofa,public Bed
{
private:int age;
public:SofaBed(){cout << "沙发床的无参构造" << endl;};SofaBed(int age,string name,int id,string colour):Jiaju(colour),Sofa(id,colour),Bed(name,colour),age(age){cout << "沙发床的有参构造" << endl;};
};
int main()
{SofaBed s2;//先调用公共基类Jiaju的无参构造,再调用第一继承的Sofa的无参构造,再调用第二继承的Bed的无参构造SofaBed s1(10,"大床",11,"白色");//先显性调用公共基类Jiaju的有参构造,再调用第一继承的Sofa的有参构造,再调用第二继承的Bed的有参构造return 0;
}

三、多态(多种形态,体现代码中Yuan类有Student和Player两种形态,形成多态)
#include <iostream>using namespace std;class Yuan//父类
{string name;int age;
public:Yuan(){};//无参构造Yuan(string name,int age):name(name),age(age){};//有参构造virtual void speek()//虚函数,用于被子类进行重写{cout << "你好" << endl;}
};class Student:public Yuan//继承Yuan的子类
{int score;
public:Student(){};//无参构造Student(string name,int age,int score):Yuan(name,age),score(score){}//有参构造void speek()//因为Yuan中也有一个speek函数,所以是对父类函数的重写{cout << "老师好" << endl;}
};class Player:public Yuan//集成Yuan的子类
{string gname;
public:Player(){};//无参构造Player(string name,int age,string gname):Yuan(name,age),gname(gname){};//有参构造void speek()//因为Yuan中也有一个speek函数,所以是对父类函数的重写{cout << "稳住,我们能赢" << endl;}
};int main()
{Yuan *p;Yuan y1;Student s1("张三",18,98);Player p1("张三",18,"阴阳");p=&y1;p->speek();//调用父类中的虚函数p=&s1;//父类指针指向子类对象p->speek();//调用子类中的重写后的函数p=&p1;//父类指针指向子类对象p->speek();//调用子类中的重写后的函数return 0;
}

1.虚析构函数
#include <iostream>using namespace std;class Person
{
private:string name;int age;
public:Person(){}Person(string name,int age):name(name),age(age){cout << "这是Person的有参构造函数" << endl;}virtual ~Person(){cout << "这是Person的析构函数" << endl;}
};class Stu:public Person
{
private:int score;
public:Stu(){}Stu(string name,int age,int score):Person(name,age),score(score){cout << "这是Stu的有参构造函数" << endl;}~Stu(){cout << "这是Stu的析构函数" << endl;}
};int main()
{//Stu s1("张三",18,90);Person *p = new Stu("李四",20,88);delete p;p=nullptr;return 0;
}

2.纯虚函数
当父类中虚函数被子类用来重写,且没有定义的意义,这个时候,一般把父类中的虚函数设置成纯虚函数。
virtual 函数返回值类型 函数名(形参列表) = 0; //纯虚函数
四、抽象类
抽象类一般是用来被继承的,它不能实例化出具体的一个对象,抽象类中至少有一个纯虚函数。
如果子类没有对父类的纯虚函数重写,那么子类也是抽象类,不能实例化一个对象
五、模板(示例代码为同类型交换)
#include <iostream>using namespace std;template <typename T>
void fun(T &a,T &b)
{T temp;temp=a;a=b;b=temp;
}int main()
{int a=10,b=20;fun(a,b);cout << a << " " << b << endl;char c='a',d='b';fun(c,d);cout << c << " " << d << endl;return 0;
}

相关文章:
c++(8.28)菱形继承,虚继承,多态,抽象类,模板+Xmind
xmind: 作业: 1.编程题: 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴…...
安装部署JavaFX和IDEA添加JavaFX的详细步骤
安装部署JavaFX和IDEA添加JavaFX的详细步骤 一、认识JavaFX二、下载JavaFX三、解压到目录下四、IDEA导入JavaFX五、添加JavaFX的VM选项六、运行命令七、总结一、认识JavaFX JavaFX是Java平台的一个图形用户界面(GUI)工具包,用于创建丰富、交互式和可视化的应用程序。JavaFX提…...
MAC电脑外放没有声音解决方案
烦人呐,我的mac外接显示屏幕,显示器没有音频输出,需要mac笔记本的音频输出,但是经常打开后,mac没有声音输出,需要重启电脑才能生效。亲测一下方法有效,请参考: 文章目录 一、短期方案…...
Spring源码分析(八)CreateBean与DoCreateBean
写目录 一 CreateBean二 doCreateBean2.1 BeanWrapper2.2 缓存删除2.3 实例化Bean2.3.1 Supplier创建对象2.3.2 工厂创建对象2.3.3 构造器创建实例无参构造构造器依赖注入Setter的依赖注入autowireConstructor实例化instantiateBean 方法 2.4 Bean的前置处理 官网:H…...
iSCSI存储服务器
目录 一、ISCSI是什么? 二、ISCSI产生背景 三、存储分类 四、ISCSI架构 五、ISCSI存储服务搭建案例 一、ISCSI是什么? ISCSI名为互联网小型计算机系统接口又称为IP-SAN,是一种新的远程存储技术,提供存储服务的目标服务器默认使用的…...
信息技术02--初/高中--分类选择题(377道题与解析)
文章目录 第一章 办公软件 1-96第二章 信息技术基础 1-41第三章 计算机系统基础 1-28第四章 多媒体技术 1-115第五章 计算机网络技术 1-50第六章 信息安全 1-3第七章 算法与程序简介 1-13第八章 数据结构 1-2第九章 数据库技术 1-20第十章 练习 1-9 第一章 办公软件 1-96 1、某…...
java --- 枚举类
目录 一、枚举类 二、创建枚举类 2.1、JDK5.0之前创建 2.2、JDK5.0使用enum创建 三、枚举类常用方法 四、枚举类实现接口 一、枚举类 枚举类型本质上也是一种类,只不过是这个类的对象是有限的、固定的几个,不能让用户随意创建。 二、创建枚举类 …...
nvm和volta对node版本控制的区别
前言——我们做前端开发的都会需要node.js环境,我们直接安装指定的版本可以么?可以,只不过在需要换版本的时候还得卸载重新装。那有工具可以帮助我们不用卸载就更改node版本么?有啊,nvm就可以。那又有没有什么工具不用…...
高斯消元解线性方程组
思路: (1)模拟线性代数解方程组办法,在此讨论正方形方程组求解。 (2)考虑几个问题: 数据存储:采用double数组存储。判断是否为零,由于double计算存在误差,…...
【linux命令讲解大全】032.介绍 Linux 中的 rcp 命令:简化主机间文件复制操作
文章目录 rcp补充说明语法选项参数实例rcp命令使用条件 从零学 python rcp 使在两台Linux主机之间的文件复制操作更简单 补充说明 rcp命令使在两台Linux主机之间的文件复制操作更简单。通过适当的配置,在两台Linux主机之间复制文件而无需输入密码,就像…...
Mysql索引、事务与存储引擎 (事务、MySQL 存储引擎)
事务 一、事务的概念: ①事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。 ②事务是一个不可分割的工…...
Doris(六)--通过 Canal 同步数据到 Doris 中
pre 开启 mysql Binlog 网上有众多方法,自行百度。 查询是否成功,在 mysql 客户端输入 show BINARY LOGS; 出现如下提示,即表示 big log 正常开启。 1,下载 canal 服务端 传送门 注意:下载 canal.deployer-xxx …...
快手Java一面,全是基础
现在已经到了面试招聘比较火热的时候,准备面试的过程中,一定要多看面经,多自测! 今天分享的是一位贵州大学的同学分享的快手一面面经。 快手一面主要会问一些基础问题,也就是比较简单且容易准备的常规八股࿰…...
未来芯片设计领域的药明康德——青芯如何在N个项目间游走平衡
总部位于上海张江的青芯半导体(CyanSemi),ASIC定制设计是其核心业务之一。 青芯在单纯的设计服务维度之上,打造了从设计到生产的一套完整ASIC定制业务,不仅做芯片设计,还提供封装、测试服务,也…...
【跟小嘉学 Rust 编程】十九、高级特性
系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...
pandas由入门到精通-数据清洗-缺失值处理
pandas-02-数据清洗&预处理 A.缺失值处理1. Pandas缺失值判断2. 缺失值过滤2.1 Series.dropna()2.2 DataFrame.dropna()3. 缺失值填充3.1 值填充3.2 向前/向后填充文中用S代指Series,用Df代指DataFrame 数据清洗是处理大型复杂情况数据必不可少的步骤,这里总结一些数据清…...
Redis 教程 - 主从复制
Redis 教程 - 主从复制 Redis 支持主从复制(Master-Slave Replication),通过主从复制可以将一个 Redis 服务器(主节点)的数据复制到其他 Redis 服务器(从节点),以实现数据的冗余备份…...
[递归] 子集 全排列和组合问题
1.1 子集I 思路可以简单概括为 二叉树,每一次分叉要么选择一个元素,要么选择空,总共有n次,因此到n1进行保存结果,返回。像这样: #include <cstdio> #include <vector> #include <algorithm&…...
ELK安装、部署、调试(四)KAFKA消息队列的安装和部署
1.简介 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通…...
半导体晶片机器视觉测量及MARK点视觉定位
半导体晶片机器视觉测量及MARK点视觉定位 客户的需求: 检测内容: SMT行业晶片位置角度与PCB板Mark点位置的测试测量 检测要求: 精度0.04mm,移动速度100mm/s 视觉可行性分析: 对样品进行了光学实验,并进行图像处理,…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
