c++(8.28)菱形继承,虚继承,多态,抽象类,模板+Xmind

news2024/11/27 3:59:08

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;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OLED透明屏是什么?什么叫做OLED透明屏的原屏?

OLED透明屏是一种新型的显示技术&#xff0c;具有高对比度、高亮度和能耗低等优势&#xff0c;正被越来越广泛地应用于各个领域中。 在OLED透明屏中&#xff0c;原屏是至关重要的元件之一。本文将深入探讨OLED透明屏原屏的意义、制造过程、品质要求、应用案例和发展趋势&#…

2023-8-28 排列数字(DFS)

题目链接&#xff1a;排列数字 #include <iostream>using namespace std;const int N 10;int n;int path[N];bool st[N];// u 看第几个位置 void dfs(int u) {if(u n){for(int i 0; i < n; i ) cout << path[i] << ;cout << endl;return ;}//…

初试Eureka注册中心

Eureka是spring cloud中的一个负责服务注册与发现的组件。遵循着CAP理论中的A(可用性)P(分区容错性)。一个Eureka中分为eureka server和eureka client。其中eureka server是作为服务的注册与发现中心。 搭建eureka服务 引入eureka依赖 引入SpringCloud为eureka提供的starter依…

0828|C++day6 菱形继承+虚继承+多态+抽象类+模板

一、思维导图 二、今日知识回顾 1&#xff09;多态 父类的指针或者引用&#xff0c;指向或初始化子类的对象&#xff0c;调用子类对父类重写的函数&#xff0c;进而展开子类的功能。 #include <iostream> using namespace std;class Zhou { private:string name;int age…

论文阅读_扩散模型_LDM

英文名称: High-Resolution Image Synthesis with Latent Diffusion Models 中文名称: 使用潜空间扩散模型合成高分辨率图像 地址: https://ieeexplore.ieee.org/document/9878449/ 代码: https://github.com/CompVis/latent-diffusion 作者&#xff1a;Robin Rombach 日期: 20…

Spring补充

一.Spring JDB 配置两个jar包 <!-- spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.2.RELEASE</version> </dependency> <!-- 阿里数据…

Python实现T检验

今天来分享一下T检验的python实现方法。 01 先来上一波概念。 1.单样本t检验&#xff0c;又称单样本均数t检验&#xff0c;适用于来自正态分布的某个样本均数与已知总体均数的比较&#xff0c;其比较目的是检验样本均数所代表的总体均数是否与已知总体均数有差别。已知总体均数…

权限提升-数据库提权-MSF-UDF提权

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的&#xff1f; 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 2、以上常见权限获取方法简要归类说明&#xff1f; 后台权限&#xff1a;SQL注入,数…

PVE 8.0.4 配置记录

前言 七夕收到了媳妇送的礼物 Beelink SER 5 PRO (Ryzen 5700U), 记录打造成私人服务器的过程. 下载安装 Proxmox 8.0.4 https://www.proxmox.com/en/downloads 安装过程中修改磁盘设置: swap 分区设置为物理内存的 2 倍, 防止虚机太多内存不足 root 最大设置为 32 GB, 多了…

SpringCloud入门——微服务调用的方式 RestTemplate的使用 使用nacos的服务名初步(Ribbon负载均衡)

目录 引出微服务之间的调用几种调用方法spring提供的组件 RestTemplate的使用导入依赖生产者模块单个配置的情况多个配置的情况没加.yaml的报错【报错】两个同名配置【细节】 完整代码config配置主启动类controller层 消费者模块进行配置restTemplate配置类controller层 使用na…

云渲染对本地电脑要求高不高?对配置有要求吗?

自己本地电脑渲不动&#xff0c;又没有用过云渲染的朋友们一般都会有这样的疑问&#xff1a;云渲染对电脑要求高不高&#xff1f;需要什么样的配置才能用上云渲染&#xff1f; 其实云渲染对本地电脑的配置是完全没有要求的&#xff0c;相反它还能减轻你本地电脑的运行负担&…

Linux驱动——模块化编程

文章目录 模块化编程方法一方法二前提模块化编程模块化编程基本框架&#xff08;重要&#xff09;模块化编程的编译ubantu上操作开发板的文件系统的指令——make超级终端上的模块指令 多模块情况1情况2 传递参数传递单个参数传递数组 模块化编程 方法一 修改kconfig&#xff…

时间序列数据在工厂运营管理中的作用

工业领域中&#xff0c;数据一直扮演着不可或缺的角色&#xff0c;而时间序列数据则因其独特的特性在工厂运营管理中发挥着极其重要的作用。从揭示趋势到支持实时决策&#xff0c;时间序列数据成为工厂智能化的关键组成部分&#xff0c;以下将对时间序列数据在工厂运营管理中的…

Linux - Docker 安装使用教程

Docker 官方文档地址: Get Started | Docker 中文参考手册: https://docker_practice.gitee.io/zh-cn/ 1.什么是 Docker 1.1 官方定义 最新官网首页 # 1.官方介绍 - We have a complete container solution for you - no matter who you are and where you are on your contain…

git difftool对比差异,避免推送不相关内容

问题 在利用git进行版本管理的时候&#xff0c;经常会由于对其他不相关的代码&#xff0c;做了一些小改动&#xff0c;例如删除了一个空行&#xff0c;多了一个缩进等。 为避免将这些不相关的改动也提交到远程&#xff0c;对PR造成不必要的影响&#xff0c;可以利用git diff命…

JVM-性能优化工具 MAT

一、MAT下载和安装 1、概述 MAT&#xff08;Memory Analyzer Tool&#xff09;工具是一款功能强大的]ava堆内存分析器。可以用于查找内存泄漏以及查看内存消耗情况。MAT是基于Eclipse开发的&#xff0c;不仅可以单独使用&#xff0c;还可以作为插件的形式嵌入在Eclipse中使用…

对话iPayLinks:在支付赛道,用技术创新发现出海“潮水的流向”

2023是充满变化和机遇的一年。从突飞猛进的Temu、TikTok Shop等新渠道&#xff0c;到“全托管模式”席卷整个跨境电商行业&#xff0c;以及Chat GPT等人工智能大模型的横空出世&#xff0c;都让出海每一环的从业者感受到“潮水流向的变化”。 不久前&#xff0c;7月及上半年进出…

爬虫项目(一):艺术二维码制作

《Python网络爬虫入门到实战》京东购买地址,这里讲解了大量的基础知识和实战,由本人编著: https://item.jd.com/14049708.html配套代码仓库地址:https://github.com/sfvsfv/Crawer艺术二维码制作 到知数云https://data.zhishuyun.com/services ,申请艺术二维码API,可免费…

【广州华锐互动】AR昆虫认知学习系统实现对昆虫形态的捕捉和还原

随着科技的不断发展&#xff0c;人们对自然界的认识也在不断加深。在这个过程中&#xff0c;AR&#xff08;增强现实&#xff09;技术的出现为人们带来了全新的体验方式。为此&#xff0c;广州华锐互动开发了AR昆虫认知学习系统&#xff0c;本文将为大家详细介绍这款系统的特点…

谷歌发布Gemini以5倍速击败GPT-4

在Covid疫情爆发之前&#xff0c;谷歌发布了MEENA模型&#xff0c;短时间内成为世界上最好的大型语言模型。谷歌发布的博客和论文非常可爱&#xff0c;因为它特别与OpenAI进行了比较。 相比于现有的最先进生成模型OpenAI GPT-2&#xff0c;MEENA的模型容量增加了1.7倍&#xf…