当前位置: 首页 > news >正文

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: 作业&#xff1a; 1.编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴…...

安装部署JavaFX和IDEA添加JavaFX的详细步骤

安装部署JavaFX和IDEA添加JavaFX的详细步骤 一、认识JavaFX二、下载JavaFX三、解压到目录下四、IDEA导入JavaFX五、添加JavaFX的VM选项六、运行命令七、总结一、认识JavaFX JavaFX是Java平台的一个图形用户界面(GUI)工具包,用于创建丰富、交互式和可视化的应用程序。JavaFX提…...

MAC电脑外放没有声音解决方案

烦人呐&#xff0c;我的mac外接显示屏幕&#xff0c;显示器没有音频输出&#xff0c;需要mac笔记本的音频输出&#xff0c;但是经常打开后&#xff0c;mac没有声音输出&#xff0c;需要重启电脑才能生效。亲测一下方法有效&#xff0c;请参考&#xff1a; 文章目录 一、短期方案…...

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的前置处理 官网&#xff1a;H…...

iSCSI存储服务器

目录 一、ISCSI是什么&#xff1f; 二、ISCSI产生背景 三、存储分类 四、ISCSI架构 五、ISCSI存储服务搭建案例 一、ISCSI是什么&#xff1f; ISCSI名为互联网小型计算机系统接口又称为IP-SAN&#xff0c;是一种新的远程存储技术&#xff0c;提供存储服务的目标服务器默认使用的…...

信息技术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创建 三、枚举类常用方法 四、枚举类实现接口 一、枚举类 枚举类型本质上也是一种类&#xff0c;只不过是这个类的对象是有限的、固定的几个&#xff0c;不能让用户随意创建。 二、创建枚举类 …...

nvm和volta对node版本控制的区别

前言——我们做前端开发的都会需要node.js环境&#xff0c;我们直接安装指定的版本可以么&#xff1f;可以&#xff0c;只不过在需要换版本的时候还得卸载重新装。那有工具可以帮助我们不用卸载就更改node版本么&#xff1f;有啊&#xff0c;nvm就可以。那又有没有什么工具不用…...

高斯消元解线性方程组

思路&#xff1a; &#xff08;1&#xff09;模拟线性代数解方程组办法&#xff0c;在此讨论正方形方程组求解。 &#xff08;2&#xff09;考虑几个问题&#xff1a; 数据存储&#xff1a;采用double数组存储。判断是否为零&#xff0c;由于double计算存在误差&#xff0c;…...

【linux命令讲解大全】032.介绍 Linux 中的 rcp 命令:简化主机间文件复制操作

文章目录 rcp补充说明语法选项参数实例rcp命令使用条件 从零学 python rcp 使在两台Linux主机之间的文件复制操作更简单 补充说明 rcp命令使在两台Linux主机之间的文件复制操作更简单。通过适当的配置&#xff0c;在两台Linux主机之间复制文件而无需输入密码&#xff0c;就像…...

Mysql索引、事务与存储引擎 (事务、MySQL 存储引擎)

事务 一、事务的概念&#xff1a; ①事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行。 ②事务是一个不可分割的工…...

Doris(六)--通过 Canal 同步数据到 Doris 中

pre 开启 mysql Binlog 网上有众多方法&#xff0c;自行百度。 查询是否成功&#xff0c;在 mysql 客户端输入 show BINARY LOGS; 出现如下提示&#xff0c;即表示 big log 正常开启。 1&#xff0c;下载 canal 服务端 传送门 注意&#xff1a;下载 canal.deployer-xxx …...

快手Java一面,全是基础

现在已经到了面试招聘比较火热的时候&#xff0c;准备面试的过程中&#xff0c;一定要多看面经&#xff0c;多自测&#xff01; 今天分享的是一位贵州大学的同学分享的快手一面面经。 快手一面主要会问一些基础问题&#xff0c;也就是比较简单且容易准备的常规八股&#xff0…...

未来芯片设计领域的药明康德——青芯如何在N个项目间游走平衡

总部位于上海张江的青芯半导体&#xff08;CyanSemi&#xff09;&#xff0c;ASIC定制设计是其核心业务之一。 青芯在单纯的设计服务维度之上&#xff0c;打造了从设计到生产的一套完整ASIC定制业务&#xff0c;不仅做芯片设计&#xff0c;还提供封装、测试服务&#xff0c;也…...

【跟小嘉学 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 支持主从复制&#xff08;Master-Slave Replication&#xff09;&#xff0c;通过主从复制可以将一个 Redis 服务器&#xff08;主节点&#xff09;的数据复制到其他 Redis 服务器&#xff08;从节点&#xff09;&#xff0c;以实现数据的冗余备份…...

[递归] 子集 全排列和组合问题

1.1 子集I 思路可以简单概括为 二叉树&#xff0c;每一次分叉要么选择一个元素&#xff0c;要么选择空&#xff0c;总共有n次&#xff0c;因此到n1进行保存结果&#xff0c;返回。像这样&#xff1a; #include <cstdio> #include <vector> #include <algorithm&…...

ELK安装、部署、调试(四)KAFKA消息队列的安装和部署

1.简介 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xff09;是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通…...

半导体晶片机器视觉测量及MARK点视觉定位

半导体晶片机器视觉测量及MARK点视觉定位 客户的需求: 检测内容&#xff1a; SMT行业晶片位置角度与PCB板Mark点位置的测试测量 检测要求&#xff1a; 精度0.04mm&#xff0c;移动速度100mm/s 视觉可行性分析: 对样品进行了光学实验&#xff0c;并进行图像处理&#xff0c…...

在线网盘系统:基于 Spring Boot 的文件存储、分类管理与分享预览实践

在线网盘系统&#xff1a;基于 Spring Boot 的文件存储、分类管理与分享预览实践 项目概述 在线网盘系统的核心目标&#xff0c;是把“文件存储”升级为“文件管理 文件预览 文件分享”的一体化平台。相比只支持上传下载的简易文件系统&#xff0c;这个项目进一步补齐了分类管…...

1987年7月14日晚上19-21点出生性格、运势和命运

1987年6月28日&#xff0c;距离二十四节气中的“小暑”&#xff08;通常在7月6-8日&#xff09;约8-10天。小暑意为“天气开始炎热但未到极致”&#xff0c;是盛夏的序曲。这个时节的哲学&#xff0c;与个人成长有着奇妙的呼应。性格的“小暑特质”&#xff1a;温润与韧性 小暑…...

Python数据流式处理:Streaming深度解析与实战

Python数据流式处理&#xff1a;Streaming深度解析与实战 引言 在Python开发中&#xff0c;数据流式处理是处理大数据和实时数据的关键技术。作为一名从Rust转向Python的后端开发者&#xff0c;我深刻体会到流式处理在处理海量数据时的优势。Python提供了多种流式处理工具&…...

智慧校园之考场作弊事实识别图像数据集 考试作弊识别监控 学生作弊识别系统数据集 AI识别作弊数据集

考试违规检测数据集简介 类别 Tags 标签 Object DetectionClasses (2) 类别&#xff08;2&#xff09; Cheating 作弊 Not Cheating 未作弊项目详情数据集类别涵盖考试场景下多种违规行为类别&#xff0c;包括但不限于作弊工具使用、交头接耳、擅自离座、抄袭等典型违规场景数据…...

py之代码实现获取字符串中每个字符的unicode值

def print_unicode_values(strings_list):"""接收字符串列表,提取所有字符的Unicode码点并以0x格式升序打印,后面加上对应字符"""unicode_values = set() # 使用集合自动去重for text in strings_list:for char in text...

终极歌词神器:5分钟学会用LDDC为你的音乐库添加完美歌词

终极歌词神器&#xff1a;5分钟学会用LDDC为你的音乐库添加完美歌词 【免费下载链接】LDDC 简单易用的精准歌词(逐字歌词/卡拉OK歌词)下载匹配工具|A simple and user-friendly tool for downloading and matching precise lyrics (word-by-word lyrics/Karaoke lyrics) 项目…...

如何在Mayo中使用剪辑平面和爆炸视图:复杂装配体分析利器

如何在Mayo中使用剪辑平面和爆炸视图&#xff1a;复杂装配体分析利器 【免费下载链接】mayo 3D CAD viewer and converter based on Qt OpenCascade 项目地址: https://gitcode.com/gh_mirrors/ma/mayo Mayo是一款功能强大的开源3D CAD查看器和转换器&#xff0c;基于Q…...

免费开源AMD Ryzen调试工具SMUDebugTool:释放处理器性能的终极指南

免费开源AMD Ryzen调试工具SMUDebugTool&#xff1a;释放处理器性能的终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...

Taotoken API Key的权限管理与审计日志功能初探

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken API Key的权限管理与审计日志功能初探 对于将大模型能力集成到业务流程中的团队而言&#xff0c;API Key的安全管理与操作…...

别再复制粘贴了!手把手教你用Git命令将本地项目一键推送到GitLab仓库(含常见错误解决)

从零掌握Git命令流&#xff1a;本地项目高效同步GitLab全指南 在代码协作开发中&#xff0c;Git已成为不可或缺的版本控制工具。尽管现代IDE提供了便捷的图形化Git操作界面&#xff0c;但真正理解并熟练运用Git命令行&#xff0c;才是开发者摆脱"界面依赖症"、深入掌…...