c++实验多态程序设计

  1. 运行程序,分析结果。

#include <iostream>

using namespace std;

class B

{

public:

    virtual void f1(double x)

    {

        cout<<"B::f1(double)"<<x<<endl;

    }

    void f2(double x)

    {

        cout<<"B::f2(double)"<<2*x<<endl;

    }

    void f3(double x)

    {

        cout<<"B::f3(double)"<<3*x<<endl;

    }

};

class D:public B

{

public:

    virtual void f1(double x)

    {

        cout<<"D::f1(double)"<<x<<endl;

    }

    void f2(double x)

    {

        cout<<"D::f2(double)"<<2*x<<endl;

    }

    void f3(double x)

    {

        cout<<"D::f3(double)"<<3*x<<endl;

    }

};

int main()

{   D d;

    B* pb=&d;

    D* pd=&d;

    pb->f1(1.23);

    pd->f1(1.23);

    pb->f2(2.23);

    pd->f2(2.23);

    pb->f3(3.23);

    pd->f3(3.23);

    return 0;

}

运行结果pb与pd一样,基类f1为虚函数,派生类D为虚函数并重写了f1
因此调用派生类版本
运行结果与传入实参相关,若修改pd结果运行结果就改变
改变类D的函数体结果与形参和函数体定义相关,类D函数f1()为虚函数对象pb为类D的实例所以改变类D的函数体后对象pb的f1()的运行结果,虚函数是根据对象的不同调用不同类的虚函数,pb是动态联编,pb的f1结果为pb的f1结果

 

运行下面的程序,分析运行结果;再把基类的析构函数定义为virtual,再运行程序,分析运行结果,体会将基类的析构函数定义为虚析构函数的作用。

#include <iostream>

using namespace std;

class BaseClass

{

public:

    BaseClass(){cout<<"BaseClass()"<<endl;}

     ~BaseClass() { cout<<"~BaseClass()"<<endl;}

};

class DerivedClass:public BaseClass

{

public:

    DerivedClass(){cout<<"DerivedClass()"<<endl;}

    ~DerivedClass(){ cout<<"~DerivedClass()"<<endl;}

};

int main()

{

    BaseClass *bp=new DerivedClass();

    delete bp;

    return 0;

}

 最先调用基类的构造函数,其次调用派生类的构造函数,调用基类的构造函数,最后只是调用了基类的构造函数基类的析构函数声明为虚构函数以后调用派生类的构造函数,调用基类的构造函数,调用派生类的构造函数,调用基类的构造函数

编写程序,计算三角形、正方形和圆形这3种图形的周长和面积,并在main函数中使用相关数据进行测试。要求:

(1)抽象出一个基类Shape类,从其派生出Triangle类(三角形类)、Square(正方形类)、Circle(圆形类)。

Shape类中定义3个protected数据成员供派生类使用,派生类中无需定义数据成员。

Shape类中定义求面积getArea()和求周长getcircumference()成员函数为虚函数。其派生类中分别重定义各自的求面积和求周长函数。

#include<iostream>
using namespace std;
#define PI 3.14
class Shape
{
public:Shape(){}~Shape() {};virtual double getArea() const{return 0.0;}virtual double getcircumference()const{return 0.0;}protected:double x;double y;double z;private:};class Triangle:public Shape  
{
public:Triangle(){}Triangle(double X, double Y, double Z) {x = X;y = Y;z = Z;};~Triangle() {};virtual double  getcircumference() const{return (x + y + z);}virtual double getArea() const{double a= (x + y + z)/2;//海伦公式double s= (a*(a-x)*(a-y)*(a-z));return s;}private:};class Square: public Shape
{
public:Square() {};Square(double X) {x = X;};~Square() {};virtual double getArea() const{return x * x;}virtual double getcircumference()const{return 4 * x;}private:};class Circle :public Shape
{
public:Circle() {};~Circle() {};Circle(double X) {x = X;};virtual double getArea() const{return PI * x * x;}virtual double getcircumference()const{return PI * 2 * x;}private:};
void fun(Shape &s)
{cout << s.getcircumference()<<" ";cout << s.getArea()<<endl;}
int main()
{Triangle t(4,2,1);cout << "Triangle的周长和面积分别为:";fun(t);Square s(5);cout << "Square的周长和面积分别为:";fun(s);Circle c(3);cout << "Square的周长和面积分别为:";fun(c);}

  1. 一个游戏中有多种怪物(Monster),怪物之间可能要发生战斗(fight),每场战斗都是一个怪物与另一怪物之间的一对一战斗。每个怪物都有自己的生命值(hitpoint)、攻击力值(damage)和防御力值(defense),每种怪物都有各自特有的攻击(attack)方式,产生相应的攻击效果;战斗时,两个怪物依次攻击对方,即怪物a首先攻击怪物b, 然后轮到怪物b攻击怪物a, 之后,怪物a再次攻击怪物b,…, 直到一方生命值为0。请根据你对上述描述的理解:(1)定义并实现怪物类Monster,成员的设计可以包括数据成员hitpoint、damage和defense,以及其他任意需要的成员函数。要求包括一个纯虚函数attack,作为派生类对象各自实现攻击细节的接口;要求定义一个非虚的成员函数fight,用来描述与另外一个怪物进行战斗的过程,该函数的实现可为Monster类的任意派生类所复用(派生类不需重新定义及实现)。不必考虑怪物的生命值减少至0后如何处理。
  2. 猫进攻导致对方的生命值减少量:

    狗进攻导致对方的生命值减少量:

    (猫的攻击力值 * 2 — 对方的防御力值)

     若上式小于1,则取1

    (狗的攻击力值 — 对方的防御力值 +5 )*2

    若上式小于2,则取2

  3. 作为怪物的特例,猫和狗的攻击效果如下表所示。在Monster的基础上,以继承手段定义并实现这两个类。
  4. (3)再增加其他派生类,如Cock类,自行定义进攻对方的生命值减少量。

     自行设计并实现游戏的测试函数,输出相互攻击的实时生命力值,并给出胜负结果

    #include <iostream>
    using namespace std;
    class Monster
    {
    public:Monster(){}Monster(int hp, int dmg, int def) : hitpoint(hp), damage(dmg), defense(def) {}~Monster(){}virtual void attack(Monster& m) const = 0;void fight(Monster& m){cout << "战斗开始!" << endl;while (m.hitpoint>0&&hitpoint>0){attack(m);if (m.hitpoint > 0){m.attack(*this);}}cout << "战斗结束" << endl;}int hitpoint;  //血量int damage;   //攻击int defense;  //防御};
    class Monster1:public Monster
    {
    public:Monster1(){}Monster1(int hp, int dmg, int def) : Monster(hp, dmg, def) {}~Monster1(){}void attack(Monster& m)const {cout << "Monster1 使用了恶龙咆哮!"<<endl;int dam = damage - m.defense;m.hitpoint -= dam;if (m.hitpoint <= 0) {cout << "Monster1赢了" << endl;m.hitpoint = 0;}cout << "造成了:" << dam << "点血量"<<endl;cout << "对方剩余" << m.hitpoint<<"点血量" <<endl;}private:};
    class Monster2:public Monster
    {
    public:Monster2(){}Monster2(int hp, int dmg, int def) : Monster(hp, dmg, def) {}~Monster2(){}void attack(Monster& m) {cout << "Monster2 使用了群魔乱舞!" << endl;int dam = damage - m.defense;m.hitpoint -= dam;if (m.hitpoint <= 0){cout << "Monster2赢了" << endl;m.hitpoint = 0;}cout << "造成了:" << dam << "点血量" << endl;cout << "对方 剩余" << m.hitpoint << "点血量" << endl;}private:};
    class CAT :public Monster
    {
    public:CAT(){}CAT(int hp, int dmg, int def) : Monster(hp, dmg, def) {}~CAT(){}void attack(Monster& m)const {cout << "CAT 使用了猫血旺!" << endl;int dam = (damage*2) - m.defense;cout << dam << endl;if (dam < 1)dam = 1;m.hitpoint -= dam;if (m.hitpoint <= 0){cout << "CAT" << endl;m.hitpoint = 0;}cout << "造成了:" << dam << "点血量" << endl;cout << "对方 剩余" << m.hitpoint << "点血量" << endl;}private:};
    class DOG :public Monster
    {
    public:DOG(){}DOG(int hp, int dmg, int def) : Monster(hp, dmg, def) {}~DOG(){}void attack(Monster& m)const {cout << "DOG 使用了狗急了跳墙!" << endl;int dam =( damage  - m.defense+5)*2;if (dam < 2)dam = 2;m.hitpoint -= dam;if (m.hitpoint <= 0){m.hitpoint = 0;cout << "造成了:" << dam << "点血量" << endl;cout << "对方 剩余" << m.hitpoint << "点血量" << endl;cout << "DOG赢了" << endl;return;}cout << "造成了:" << dam << "点血量" << endl;cout << "对方 剩余" << m.hitpoint << "点血量" << endl;}private:};
    class Cock:public Monster
    {
    public:Cock(){}Cock(int hp, int dmg, int def) : Monster(hp, dmg, def) {}~Cock(){}void attack(Monster& m)const {cout << "Cock 使用了公鸡独立!" << endl;int dam = (damage - m.defense + 50) ;if (dam < 2)dam = 2;m.hitpoint -= dam;if (m.hitpoint <= 0){m.hitpoint = 0;cout << "造成了:" << dam << "点血量" << endl;cout << "对方 剩余" << m.hitpoint << "点血量" << endl;cout << "Cock赢了" << endl;return;}cout << "造成了:" << dam << "点血量" << endl;cout << "对方剩余" << m.hitpoint << "点血量" << endl;}private:};
    int main()
    {//Monster1 m1(100, 30, 10);//Monster1 m2(100, 25, 8);//m1.fight(m2);CAT  c(50, 30, 10);//DOG d(90, 50, 40);Cock k(50, 50, 50);c.fight(k);}
    

    设计一个复数Complex类,实现复数的加、减运算,并实现复数的输入、输出。已知测试main函数如下:

    int main( )

    {

        Complex c1(5.0,10.0);    //5+10i

        Complex c2(3.0,-2.5);     //3-2.5i

        Complex c3,c4,c5=20;

        c3=c1+c2;

        c4=c1-5;

        cout<<c1<<c2<<c3<<c4;

        Complex c5;

        cout<<"请输入一个复数,实部和虚部以空格分开:"<<endl;

        cin>>c5;

        cout<<"输入的复数为:"<<c5<<endl;

        c4=5+c5;

        cout<<c4<<endl;

        return 0;

    }

    #include <iostream>
    using namespace std;
    class Complex {
    private:double real;  // 实部double imag;  // 虚部public:// 构造函数Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}// 加法运算Complex operator+(const Complex& other) const {return Complex(real + other.real, imag + other.imag);}// 实数 + 复数friend Complex operator+(double realPart, const Complex& c) {return Complex(realPart + c.real, c.imag);}// 实数 - 复数friend Complex operator-(double realPart, const Complex& c) {return Complex(realPart - c.real, -c.imag);}// 减法运算Complex operator-(const Complex& other) const {return Complex(real - other.real, imag - other.imag);}// 输出复数friend std::ostream& operator<<(std::ostream&os, Complex& c){os << c.real;if (c.imag >= 0)os << '+';os << c.imag <<"i" << endl;return os;}// 输入复数friend std::istream& operator>>(std::istream& is, Complex& c) {std::cout << "输入实部: ";is >> c.real;std::cout << "输入虚部: ";is >> c.imag;return is;}
    };int main()
    {Complex c1(5.0, 10.0);   	//5+10iComplex c2(3.0, -2.5);    	//3-2.5iComplex c3, c4, c5 = 20;c3 = c1 + c2;c4 = c1 - 5;cout << c1 << c2 << c3 << c4;Complex c6;cout << "请输入一个复数,实部和虚部以空格分开:" << endl;cin >> c6;cout << "输入的复数为:" << c5 << endl;c4 = 5 + c5;cout << c4 << endl;return 0;
    }
    

    设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+",以实现求两个三角形对象的面积之和,进一步实现3个或更多的三角形对象相加的面积之和。

    分析提示:在Triangle类中设计一个友元函数double operator+(Triangle t1,Triangle t2),它重载运算符“+",返回t1和t2两个三角形的面积之和。

    已知测试main函数如下:

    int main()

     {

         Triangle tri1(3,4,5),tri2(6,8,10);

         double area1=tri1+tri2;

         cout<<area1<<endl;

         Triangle tri3(9,12,15);

         double area2=tri1+tri2+tri3;

         cout<<area2<<endl;

         return 0;

     }

    #include <iostream>
    using namespace std;class Triangle
    {
    public:Triangle(double a=0, double b=0,double c=0){x = a;y = b;z = c;}~Triangle(){}friend double operator + (const Triangle& other1,const Triangle& other2){double a1 = (other1.x + other1.y + other1.z) / 2;double a2 = (other2.x + other2.y + other2.z) / 2;double s1 = sqrt(a1 * (a1 - other1.y) * (a1 - other1.x) * (a1 - other1.z));double s2 = sqrt(a2 * (a2 - other2.x) * (a2 - other2.y) * (a2 - other2.z));return s1 + s2;}friend double operator + (double snum,const Triangle& other){double a = (other.x + other.y + other.z) / 2;double s = sqrt(a * (a - other.y) * (a - other.x) * (a - other.z));cout << s << endl;return snum+s;}private:double x;double y;double z;
    };
    int main()
    {Triangle tri1(3, 4, 5), tri2(6, 8, 10);double area1 = tri1 + tri2;cout << area1 << endl;Triangle tri3(9, 12, 15);double area2 = tri1 + tri2 + tri3;cout << area2 << endl;return 0;
    }
    

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

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

相关文章

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis中参数传递问题

第一章 Mybatis中参数传递问题 1.1 单个普通参数 可以任意使用&#xff1a;参数数据类型、参数名称不用考虑 1.2 多个普通参数 Mybatis底层封装Map结构&#xff0c;封装key为param1、param2…【支持&#xff1a;arg0、arg1、…】 1.3 命名参数 语法&#xff1a; Param(val…

时间序列预测实战(二十五)PyTorch实现Seq2Seq进行多元和单元预测(附代码+数据集+完整解析)

一、本文介绍 本文给大家带来的时间序列模型是Seq2Seq&#xff0c;这个概念相信大家都不陌生了&#xff0c;网上的讲解已经满天飞了&#xff0c;但是本文给大家带来的是我在Seq2Seq思想上开发的一个模型和新的架构&#xff0c;架构前面的文章已经说过很多次了&#xff0c;其是…

MySQL数据库,函数与分组

单行函数&#xff1a; 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以嵌套 参数也可以是一列或一个值 数值函数 基本函数&#xff1a; 注&#xff1a;ROUND(x,y)函数的y是负数时&#xff0c;即往高位进行四舍五入&#xff0c;如-3就是按百位…

Python-函数详解(局部、全局变量)

函数:一段可以被重复利用的代码 函数定义&#xff1a; def 函数名 (参数) 函数体 return 返回值(可有可无) def 函数名()#函数参数#函数体return #返回值&#xff08;可有可无&#xff09; 函数的调用&#xff1a;先定义&#xff0c;后调用 警告和错误&#xff1a; …

出生率持续下降,而低代码,成了!

低代码这个概念在IT界应该是火了很久&#xff0c;在十年前就有低代码的概念。 在最初的时候&#xff0c;我们都是用高级语言或者脚本来开发页面或者应用&#xff0c;比如Java、C&#xff0c;前端会使用Vue、React等等。但是我们发现经常写的功能或者页面都是重复的&#xff0c;…

Python实现内网穿透和端口转发代理

对于大型的爬虫项目&#xff0c;肯定需要有良好的反爬机制&#xff0c;还应该配合代理iP使用&#xff0c;只有这两种结合才能让你的爬虫更高效准确。今天我就借用我一点空闲时间&#xff0c;来谈一谈有关python爬虫网络方面的解决方案&#xff0c;这里提供内网穿透和端口转发两…

分治法解决众数重数

问题 D: 22-数组-2-众数问题 [命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述 问题描述&#xff1a; 给定含有n个元素的多重集合S&#xff0c;每个元素在S中出现的次数称为该元素的重数&#xff0c;其中重数最大的元素称为众数。 例如&#xff0c;S{1&a…

基于多波束和时间调制平均的相位量化栅瓣抑制方法极其性能极限

概要 为了抑制相位量化所导致的量化栅瓣,在波束合成中引入随机虚拟相移(RVPS,Random Virtual Phase Shift),采用多波束平均(MBS,Multi-beam Average)或时间调制平均(TMA,Time-Modulated Average)方法实现了对量化栅瓣的抑制,仿真验证了方法的有效性及限制,并进一…

印刷企业实施数字工厂管理系统有几个步骤

随着科技的飞速发展&#xff0c;许多传统行业正面临着前所未有的挑战。印刷行业也不例外&#xff0c;尤其在面对生产效率低下&#xff0c;资源浪费严重等问题时&#xff0c;数字工厂管理系统的实施成为了必然选择。那么&#xff0c;印刷企业实施数字工厂管理系统具体有几个步骤…

echarts 柱状图 定时自动轮播(非提示框轮播)

看了很多文档都是实现提示框轮播的&#xff0c;而我要实现的功能是&#xff1a;柱状图有多条数据时&#xff0c;轮播展示其中几条&#xff0c;比如我有100条数据&#xff0c;不能全部展示&#xff0c;设置轮播5条或者10条&#xff0c;依次显示数据&#xff0c;并形成闭环。 &a…

zabbix配置snmp trap--使用snmptrapd和Bash接收器--图文教程

1.前言 我的zabbix的版本是5.0版本&#xff0c;5.0的官方文档没有使用bash接收器的示例&#xff0c;6.0的官方文档有使用bash接收器的示例&#xff0c;但是&#xff0c;下载文件的链接失效&#xff1f;&#xff01; 这里讲解zabbix-server端配置和zabbix web端配置 2.zabbix-…

11、pytest断言预期异常

官方用例 # content of test_exception_zero.py import pytestdef test_zero_division():with pytest.raises(ZeroDivisionError):1/0# content of test_exception_runtimeerror.py import pytestdef test_recursion_depth():with pytest.raises(RuntimeError) as excinfo:def…

高效的单行python脚本

#-- coding: utf-8 -- “”" Created on Wed Dec 6 13:42:00 2023 author: czliu “”" 1. 平方列表推导 #使用列表推导法计算从 1 到 10 的数字平方 squares [x**2 for x in range(1, 11)] print(squares)2.求偶数 #可以使用列表推导式从列表中筛选偶数。还可以…

【Docker】 Docker attach 命令卡死的解决方案

在启动较早期的容器时&#xff0c;出现了使用 docker attach container_name 命令后卡死的问题。本文介绍了如何解决该问题。 首先&#xff0c;在使用 docker attach container_name 命令前需要先保证容器已经开启。此时&#xff0c;输入 docker attach container_name 命令后…

ncnn模型部署——使用VS2019把项目打包成DLL文件

一、项目打包成DLL文件 1.创建动态链接库DLL项目 创建完成&#xff0c;项目中包含源文件dllmain.cpp, pch.cpp&#xff0c;头文件framework.h, pch.h 2.编写和配置DLL项目 &#xff08;1&#xff09;配置pch.h文件&#xff0c;在头文件pch.h中定义宏&#xff0c;宏的作用的是…

【PyTorch】模型

文章目录 1. 模型的创建1.1. 创建方法1.1.1. 通过使用模型组件1.1.2. 通过继承nn.Module类 1.2. 将模型转移到GPU 2. 模型参数初始化3. 模型的保存与加载3.1. 只保存参数3.2. 保存模型和参数 1. 模型的创建 1.1. 创建方法 1.1.1. 通过使用模型组件 可以直接使用模型组件快速…

【Unity动画】Unity 2D动画创建流程

本文以2D为案例&#xff0c;讲解Unity 播放动画的流程 准备和导入2D动画资源 外部导入序列帧生成的 Unity内部制作的 外部导入的3D动画 2.创建动画过程 打开时间轴Ctrl6 选中场景中的一个未来需要播放动画的物体 回到时间轴点击Create一个新动画片段 拖动2D动画资源放入…

什么是SPA(Single Page Application)?它的优点和缺点是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

IT外包对中小企业的独特优势

在竞争激烈的商业环境中&#xff0c;企业的发展稍有缓慢&#xff0c;就很有可能被竞争对手快速赶超、趁机抢占市场。一些中小企业为了更好地应对市场变化和提高自身竞争力&#xff0c;越来越多地转向了IT外包服务。相较于大型企业&#xff0c;中小企业在选择IT外包时能够获得一…

数据结构实验任务七:基于广度优先搜索的六度空间理论验证

问题描述 “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论 可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是 说&#xff0c;最多通过五个人你就能够认识任何一个陌生人。”假如给你一个社交网络图&#xf…