C++重点和练习-----多态

rpg.cpp:

#include <iostream>using namespace std;/*模拟一个游戏场景有一个英雄:初始所有属性为1atk,def,apd,hp游戏当中有以下3种武器长剑Sword: 装备该武器获得 +1atx,+1def短剑Blade: 装备该武器获得 +1atk,+1spd斧头Axe:   装备该武器获得 +1atk,+1hp要求英雄写一个函数:equipweapon 装备武器实现效果:装备不同武器英雄获得不同的属性加成
*/class Hero;class Weapon
{int atk;
public:Weapon():atk(1){}virtual ~Weapon(){}void set_atk(int atk){this->atk = atk;}int get_atk(){return atk;}virtual void equip(Hero &h);
};class Sword:public Weapon
{int def;
public:Sword():def(1){}void set_def(int def){this->def = def;}int get_def(){return def;}void equip(Hero &h) override;
};class Blade:public Weapon
{int spd;
public:Blade():spd(1){}void set_spd(int spd){this->spd = spd;}int get_spd(){return spd;}void equip(Hero &h) override;
};class Axe:public Weapon
{int hp;
public:Axe():hp(1){}void set_hp(int hp){this->hp = hp;}int get_hp(){return hp;}void equip(Hero &h) override;
};class Hero
{int atk;int def;int spd;int hp;Weapon * current_weapon;
public:Hero():atk(1),def(1),spd(1),hp(1),current_weapon(new Weapon){}~Hero(){delete current_weapon;}void set_atk(int atk){this->atk = atk;}int get_atk(){return atk;}void set_def(int def){this->def = def;}int get_def(){return def;}void set_spd(int spd){this->spd = spd;}int get_spd(){return spd;}void set_hp(int hp){this->hp = hp;}int get_hp(){return hp;}void equip_weapon(Weapon *w);void show();
};void Weapon::equip(Hero &h)
{int new_atk = h.get_atk() + this->get_atk();h.set_atk(new_atk);
}void Sword::equip(Hero &h)
{Weapon::equip(h);int new_def = h.get_def() + def;h.set_def(new_def);
}void Blade::equip(Hero &h)
{Weapon::equip(h);int new_spd = h.get_spd() + spd;h.set_spd(new_spd);}void Axe::equip(Hero &h)
{Weapon::equip(h);int new_hp = h.get_hp() + hp;h.set_hp(new_hp);
}void Hero::equip_weapon(Weapon *w)
{delete current_weapon;current_weapon = w;w->equip(*this);}void Hero::show()
{cout << "******** 英雄属性 ********" << endl<< "  " << "atk = " << atk << endl<< "  " << "def = " << def << endl<< "  " << "spd = " << spd << endl<< "  " << "hp = \t" << hp << endl<< "**************************" << endl;
}int main()
{Hero h1,h2,h3;h1.equip_weapon(new Sword);h2.equip_weapon(new Blade);h3.equip_weapon(new Axe);h1.show();h2.show();h3.show();return 0;
}

通过虚函数解决菱形继承产生的二义性问题

    A       --------公共基类/   \B     C    --------中间子类\   /D       --------汇集子类
B类中会继承A类的成员,C类中也继承A类的成员,
D类中汇集成B和C中的所有成员 ------>导致A类中的内容,在D类中存在两份
有可能造成代码膨胀
#include <iostream>
using namespace std;
class A
{
public:int a;A():a(9){cout << "A构造" << endl;}
};
class B:public A
{
public:int b;B():b(0){cout << "B构造" << endl;}
};
class C:public A
{int c;
public://因为继承顺序是先继承B,再继承A,所以B先构造结束,后A构造结束,最后C构造结束//和初始化列表中的调用顺序无关C():c(6),A(){cout << "C构造" << endl;}void show();
};
class D:public B,public C
{void show_a(){//cout << a << endl;   //因为中间基类中存在两种方式可以找到acout << B::a << endl;  //存在于B类中的A类继承下来的acout << C::a << endl;  //存在于C类中的A类继承下来的a}
};
int main()
{C c1;c1.show();return 0;
}

 虚继承(virtual)

#include <iostream>using namespace std;class Person
{int age;                //4字节string name;            //32字节 +4对齐 36
public:Person(){}Person(int age,string name):age(age),name(name){}virtual void show();    //虚指针 8字节
};                          //48class Stu:public Person     // 继承Person 48
{double score;           //56
public:Stu(){}Stu(int age,string name,double score):Person(age,name),score(score){}void show();            //对虚指针指向的虚函数表中的show进行重写
};                          //56void Person::show()
{cout << "Person 中的show函数 " << endl;cout << "age = " << age << endl;cout << "name = " << name << endl;
}void Stu::show()
{cout << "Stu 中的show函数 " << endl;cout << "score = " << score << endl;
}int main()
{cout << sizeof (Person) << endl;cout << sizeof (Stu) << endl;Stu s1(18,"张三",99);Person &rp = s1;rp.show();rp.Person::show();return 0;
}

在菱形继承中,由于汇集子类中会保存两份公共基类的内容造成二义性问题,所以通常两个中间子类会虚继承公共基类 ------>在汇集子类中就只存在一份公共基类的内容

#include <iostream>
using namespace std;
class A
{
public:int a;A():a(9){cout << "A构造" << endl;}
};
//中间子类虚继承公共基类A
class B:virtual public A
{
public:int b;B():b(0),A(){cout << "B构造" << endl;}
};
class C:virtual public A
{int c;
public://因为继承顺序是先继承B,再继承A,所以B先构造结束,后A构造结束,最后C构造结束//和初始化列表中的调用顺序无关C():c(6),A(){cout << "C构造" << endl;}void show();
};
class D:public B,public C
{//汇集子类的构造函数中对于公共基类的构造,需要直接调用公共基类的构造函数即可D():B(),C(),A(){}void show_a(){//不加virtual,有两份A中的acout << a << endl;   //由于我们使用了虚继承,所以D类中只有一份从公共基类中继承下来的acout << B::A::a << endl;cout << C::A::a << endl;}
};
int main()
{C c1;c1.show();return 0;
}

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

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

相关文章

Qt之点击鼠标右键创建菜单栏使用(六)

Qt开发 系列文章 - menu&#xff08;六&#xff09; 目录 前言 一、示例演示 二、菜单栏 1.MenuBar 2.Menu 总结 前言 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08;menubar&#xff09;、多个工具栏(toolbars)、一个状态栏(status…

天猫魔盒M17/M17S_超级UI 线刷固件包-可救砖(刷机取消双勾)

在智能电视盒子的领域中&#xff0c;天猫魔盒 M17 以其独特魅力占据一席之地&#xff0c;然而&#xff0c;原厂设置有时难以满足进阶用户的多元需求。此刻&#xff0c;刷机成为开启全新体验的关键钥匙&#xff0c;为您的盒子注入鲜活能量。 一、卓越固件特性概览 此款精心打造的…

Elasticsearch 7.x入门学习-Spring Data Elasticsearch框架

1 Spring Data框架 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce 框架和云计算数据服务。 Spring Data 可以极大的简化 JPA的写法&#xff0c;…

【落羽的落羽 C语言篇】一些常见的字符函数、字符串函数、内存函数

文章目录 一、字符函数1. 字符分类函数2. 字符转换函数 二、字符串函数1. strlen的使用和模拟实现使用模拟实现 2. strcpy的使用和模拟实现使用模拟实现 3. strcat的使用和模拟实现使用模拟实现 4. strcmp的使用和模拟实现使用模拟实现 5. strncpy的使用6. strncat的使用7. str…

JAVA:访问者模式(Visitor Pattern)的技术指南

1、简述 访问者模式(Visitor Pattern)是一种行为型设计模式,允许你将操作分离到不同的对象中,而无需修改对象本身的结构。这种模式特别适合复杂对象结构中对其元素进行操作的场景。 本文将介绍访问者模式的核心概念、优缺点,并通过详细代码示例展示如何在实际应用中实现…

小米自研系统Vela全面开源:开启物联网新时代的技术革新之旅

目录 Vela系统的技术特点 1. 高性能与低功耗的完美平衡 2. 高度可扩展性与模块化设计 3. 强大的安全机制 4. 跨平台兼容性 Vela系统的应用场景 1. 智能家居领域 2. 工业物联网领域 3. 医疗健康领域 4. 智慧城市领域 Vela系统的深远影响 1. 推动物联…

Linux/CentOS编译TensorFlow

很多时候为了方便图省事&#xff0c;是通过pip安装TensorFlow的&#xff0c;然而很不幸运行的服务器不支持AVX指令&#xff0c;引入模块的时候会报错&#xff1a; The TensorFlow library was compiled to use AVX instructions, but these aren’t available on your machine.…

2021陇剑杯——流量分析

JWT简介 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用环境中以一种紧凑的、URL安全的方式传递声明&#xff08;Claims&#xff09;。JWT通常用于身份验证、信息交换以及验证消息的完整性。JWT通过在不…

visual studio 2022 c++使用教程

介绍 c开发windows一般都是visual studio&#xff0c;linux一般是vscode&#xff0c;但vscode调试c不方便&#xff0c;所以很多情况都是2套代码&#xff0c;在windows上用vs开发方便&#xff0c;在转到linux。 安装 1、官网下载vs2022企业版–选择桌面开发–安装位置–安装–…

Grafana配置告警规则推送企微机器人服务器资源告警

前提 已经部署Grafana&#xff0c;并且dashboard接入数据 大屏编号地址&#xff1a;Node Exporter Full | Grafana Labs 创建企微机器人 备注&#xff1a;群里若有第三方外部人员不能创建 机器人创建完成&#xff0c;记录下来Webhook地址 Grafana配置告警消息模板 {{ define &…

yolov7-搭建及测试

1.环境配置 参考链接&#xff0c;建立环境 2.YOLOv7代码下载 代码及论文地址&#xff1a; GitHub - WongKinYiu/yolov7: Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors 下载zip后解压 注意&am…

HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由

网络层数据封装 首先IP地址封装在网络层&#xff0c;它用于标识一台网络设备&#xff0c;其中IP地址分为两个部分&#xff0c;网络地址和主机地址&#xff0c;通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言&#xff0c;它细分为五类&#xff0c;A,B,C,D,E,…

信号处理相关的东东(学习解惑)

信号处理相关的东东&#xff08;学习解惑&#xff09; 所有内容学习自知乎专栏&#xff0c;https://www.zhihu.com/column/xinhao&#xff0c;写的很好&#xff0c;值得反复学习 时频域分析的一些常用概念 FROM&#xff1a;https://zhuanlan.zhihu.com/p/35742606 1、相加性…

【cocos creator】按照行列数创建格子布局

调用 this.creatLayout(5, 5, this.boxNode, this.rootNode) //限制数量 this.creatLayout(5, 5, this.boxNode, this.rootNode, cc.v3(0, 0), 10, 10, 23) /*** 创建格子布局* param xCount 列数量* param yCount 行数量* param prefab 预制体* param root 根节点* param root…

WPF 控件

<div id"content_views" class"htmledit_views"><p id"main-toc"><strong>目录</strong></p> WPF基础控件 按钮控件&#xff1a; Button:按钮 RepeatButton:长按按钮 RadioButton:单选按钮 数据显示控件 Te…

java中List集合小练习

题目&#xff1a;将1~100之间所有正整数存放在一个List集合中&#xff0c;并将集合索引位置时10的对象从集合中移除。 代码&#xff1a; import java.util.ArrayList; import java.util.List;public class ListTest {public ListTest(){List<Integer> listnew ArrayLis…

RK3566触摸驱动产品实战 配置设备树 I2C驱动框架(附源码)

引言&#xff1a;相信大家在学完相关驱动框架很少真正的运用在实际的产品案例中&#xff0c;对设备树以及驱动框架还是非常的陌生&#xff0c;其次就是在编写相关驱动还有完成项目任务时的一些思路的引导&#xff0c;这些都是需要补足的&#xff0c;接下来&#xff0c;我们将之…

Qt WORD/PDF(二)使用 QtPdfium库实现 PDF操作、打印等

关于QT Widget 其它文章请点击这里: QT Widget GitHub 源码: QWidgetLearningPro &#xff08;暂未更新&#xff09; 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 预览 一、简介 QtPdfium 是基于Pdfium库的一个Qt绑定。Pdfium是一个…

信息收集(dns信息收集dnsenum和路由收集traceroute)

导入 被动收集方式不容易被目标域发现 DNS信息收集 网络拓扑结构以及网络设置 服务机 路由器 kali机 查看并设置默认网关 工具 或者在系统目录下可找到dns的工具 dnsenum dnsenum -h 帮助指令 收集百度域的指令 使用字典文件破解对查找目标域进行收集 dnsmap 对自己的虚拟机…

Java设计模式 —— 【结构型模式】适配器模式(类的适配器、对象适配器、接口适配器)详解

文章目录 基本介绍一、类的适配器二、对象适配器三、接口适配器总结 基本介绍 生活中有很多例子&#xff1a; 不同国家的插座接口不同&#xff0c;需要转换器&#xff1b;家用电源220V&#xff0c;手机只接受5V充电&#xff0c;需要转换器&#xff1b;读卡器&#xff0c;拓展…