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 视觉可行性分析: 对样品进行了光学实验,并进行图像处理,…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...