实验报告

  • 题目1
  • 题目2

【实验名称】 实验七 类的继承(1)
【实验内容】

题目1

以动物类为父类进行派生,设计可行的派生类,为派生类增加必要的成员,并对父类中的成员做适当调整,在主程序中对派生类的对象进行操作。

Animal.h

/**动物类头文件*/
#ifndef ANIMAL_H
#define ANIMAL_H#include<iostream>
#include<windows.h>
using namespace std;class Animal {public:Animal(){}  //默认构造函数Animal(string name,int age,string color,string voice,string food);void setName(string name){ this->name = name; }     //设置每个成员变量的值void setAge(int age){ this->age = age; }void setColor(string color){ this->color = color; }void setVoice(string voice){ this->voice = voice; }void setFood(string food){ this->food = food; }string getName(){ return name; }         //得到每个成员变量的值int getAge(){ return age; }string getColor(){ return color; }string getVoice(){ return voice; }string getFood(){ return food; }void shout();//动物吃东西void eat(){    cout << name << "开始吃" << food <<endl;}void beginSleep();string name;    //名字int age;        //年龄string color;   //颜色string voice;   //叫声string food;    //食物
};#endif // ANIMAL_H

Animal.cpp

 /**动物类函数实现*/
#include<iostream>
#include"Animal.h"
using namespace std;Animal::Animal(string name,int age,string color,string voice,string food){  //带所有成员变量的构造函数this->name = name;this->age = age;this->color = color;this->voice = voice;this->food = food;}void Animal::shout(){        //动物的叫cout << "我是一只" << name << endl;cout << "我的叫声是:" << voice << endl;}void Animal::beginSleep(){  //动物睡觉int sleepTime = rand()%4;cout <<"哄" << name << "开始睡觉,随机的睡觉的时间为:"<<sleepTime<<"(小时)" <<endl;Sleep(sleepTime * 1000);cout << name <<"睡醒了" <<endl;}

Cat.cpp

 /**猫类*/
#include<iostream>
#include"Animal.h"
#include"Mouse.cpp"
#include"Dog.cpp"
using namespace std;class Cat:public Animal{public:Cat(){}Cat(string name,int age,string color,string voice,string food,string variety,int speed){  //Cat带所有成员变量的构造函数this->name = name;this->age = age;this->color = color;this->voice = voice;this->food = food;this->variety = variety;this->speed = speed;}void setVariety(string variety){ this->variety = variety; }string getVariety(){ return variety; }void catchMouse(Mouse &m,Dog &d){m.seek();cout<<name<<"可以抓"<<m.name<<endl;int distance = rand()%3+6;cout<<name<<"发现"<<distance<<"米处有一只"<<m.name<<"正在偷吃蛋糕,迅速冲向它"<<endl;double time = (double)(distance - m.reaction)/this->speed;cout<<time<<"秒过后,"<<this->name<<"离"<<m.name<<"只有"<<m.reaction<<"米"<<endl;m.help();int dogTime = rand()%4;cout<<d.name<<"听到"<<m.name<<"呼救,马上过来救它,大约需要"<<dogTime<<"秒"<<endl;time = (double)(m.reaction)/(this->speed - m.speed);if(dogTime > time){cout<<time<<"秒过后,"<<this->name<<"把"<<m.name<<"抓住"<<endl;cout<<dogTime - time<<"秒过后,"<<d.name<<"赶到,"<<m.name<<"已经被吃掉了"<<endl;}else{cout<<dogTime<<"秒过后,"<<d.name<<"赶到,救下"<<m.name<<endl;}}private:string variety;  //品种int speed;  //速度
};

Dog.cpp

/**狗类*/
#include<iostream>
#include"Animal.h"
using namespace std;class Dog:public Animal{public:friend class Cat;Dog(){}Dog(string name,int age,string color,string voice,string food,string get_upTime,string sleepTime){  //带所有成员变量的构造函数this->name = name;this->age = age;this->color = color;this->voice = voice;this->food = food;this->get_upTime = get_upTime;this->sleepTime = sleepTime;}void setGet_upTime(string get_upTime){ this->get_upTime = get_upTime; }void setSleepTime(string sleepTime){ this->sleepTime = sleepTime; }string getGet_upTime(){ return get_upTime; }string getSleepTime(){ return sleepTime; }void smell(){cout<<name<<"的嗅觉非常灵敏"<<endl;}void scakTime(){cout<<name<<"晚上的睡觉时间是:"<<sleepTime<<endl;cout<<name<<"白天的起床时间是:"<<get_upTime<<endl;}private:string get_upTime;string sleepTime;
};

Mouse.cpp

/**老鼠类*/
#include<iostream>
#include"Animal.h"
using namespace std;class Mouse:public Animal{public:friend class Cat;Mouse(string name,int age,string color,string voice,string food,int reaction,int speed){  //Muse类带所有成员变量的构造函数this->name = name;this->age = age;this->color = color;this->voice = voice;this->food = food;this->reaction = reaction;this->speed = speed;}void seek(){cout<<name<<"开始出门找吃的"<<endl;}void help(){cout<<"当猫离"<<name<<"只有"<<reaction<<"米时,"<<name<<"发现了"<<"猫"<<endl;cout<<name<<"开始疯狂逃命,并大声呼救:"<<voice<<" "<<voice<<endl;}int reaction;  //反应距离int speed;  //速度
};

Main.cpp

/*主程序测试类*/
#include<iostream>
#include <time.h>
#include"Animal.cpp"
#include"Cat.cpp"
using namespace std;int main() {srand((unsigned)time(NULL));Dog dog("小黑狗",/**年龄*/ 3,"黑色","汪汪汪","骨头","12:00","6:00");dog.eat();  ///狗吃东西dog.smell();  ///狗的嗅觉dog.scakTime();  ///狗的睡觉时间cout<<endl;Cat cat("小花猫",/**年龄*/ 2,"花色","喵喵喵","鱼","狸猫",/**速度*/ 2);cat.shout();   ///猫的叫声cat.beginSleep();  ///猫开始睡觉cout<<endl;Mouse mouse("小白鼠",/**年龄*/ 1,"白色","吱吱吱","蛋糕",/**反应距离*/ 2,/**速度*/ 1);cat.catchMouse(mouse,dog);   ///猫抓老鼠cout<<endl;cat.catchMouse(mouse,dog);   ///猫抓老鼠
}

【实验结果】

题目2

以游戏为背景,设计一个表示武器的父类,并实现至少两个子类。为设计出来的类设置适当的成员变量、成员函数和构造函数,在主程序中生成对象进行测试。

源代码:
Weapon.cpp

 /*武器类*/
#ifndef Weapon_CPP
#define Weapon_CPP
#include<iostream>
#include<stdlib.h>
using namespace std;class Weapon{public:Weapon(){}Weapon(string name , int aggressivity , float crit , int strikDistance , int durability){this->name = name;this->aggressivity = aggressivity;this->crit = crit;this->strikDistance = strikDistance;this->durability = durability;}void setName(string name){  this->name = name;  }void setaggressivity(int aggressivity){  this->aggressivity = aggressivity;  }void setCrit(float crit){  this->crit = crit;  }void setStrikDistance(int strikDistance){  this->strikDistance = strikDistance;  }void setDurability(int durability){  this->durability = durability;  }string getName(){ return name; }int getaggressivity(){ return aggressivity; }float getCrit(){ return crit; }int getStrikDistance(){ return strikDistance; }int getDurability(){ return durability; }void attack(Weapon &w){  //发起一次攻击cout <<name <<"的攻击力是:"<<aggressivity<<endl;cout <<name <<"的暴击率是:"<<crit<<endl;cout <<name <<"的攻击距离是:"<<strikDistance<<endl;cout <<name <<"现在要去攻击"<<w.name<<endl;if(this->strikDistance > w.strikDistance){cout <<name <<"的攻击距离大于"<<w.name<<"的攻击距离,可以攻击"<<endl;float temp1 = rand()%100/(float)100;  //当前对象是否产生暴击int exchange1 = this->aggressivity;  //当前对象暴击后的攻击力if(temp1 < this->crit){exchange1 = exchange1 * 2;cout <<this->name <<"本次攻击产生暴击,攻击力变为两倍:"<<exchange1<<endl;}else cout <<this->name <<"本次攻击没有产生暴击,攻击力不变,依然为:"<<exchange1<<endl;float temp2 = rand()%100/(float)100;   //w对象是否产生暴击int exchange2 = w.aggressivity;  //w对象暴击后的攻击力if(temp2 < w.crit){exchange2 = exchange2 * 2;cout <<w.name <<"本次攻击产生暴击,攻击力变为两倍:"<<exchange2<<endl;}else cout <<w.name <<"本次攻击没有产生暴击,攻击力不变,依然为:"<<exchange2<<endl;if(exchange1 > exchange2)  {cout<<this->name <<"的攻击力:"<<exchange1<<" 大于"<<w.name<<"的攻击力:"<<exchange2<<" 攻击胜利!"<<endl;}else cout<<this->name <<"的攻击力:"<<exchange1<<" 小于"<<w.name<<"的攻击力:"<<exchange2<<" 攻击失败!"<<endl;}else cout <<name <<"的攻击距离小于"<<w.name<<"的攻击距离,攻击不到"<<endl;}string name;int aggressivity;  //攻击力float crit;  //暴击率int strikDistance;  //攻击距离int durability;  //耐久度
};
#endif // Weapon_CPP

Arrow.cpp

/*弓箭类*/
#include<iostream>
#include"Weapon.cpp"
using namespace std;class Arrow:public Weapon{  //弓箭
public:Arrow(){}Arrow(string name , int aggressivity , float crit , int strikDistance , int durability , float attackSpeed){this->name = name;this->aggressivity = aggressivity;this->crit = crit;this->strikDistance = strikDistance;this->durability = durability;this->attackSpeed = attackSpeed;}void effect(){cout<<"装备弓箭,攻击距离加100"<<endl;strikDistance = strikDistance + 100;}float attackSpeed;  //攻击速度
};

Sword.cpp

 /*刀剑类*/
#include<iostream>
#include"Weapon.cpp"
using namespace std;class Sword:public Weapon{  //刀剑
public:Sword(){}Sword(string name , int aggressivity , float crit , int strikDistance , int durability , int attackAddition){this->name = name;this->aggressivity = aggressivity;this->crit = crit;this->strikDistance = strikDistance;this->durability = durability;this->attackAddition = attackAddition;aggressivity = aggressivity + 0.5 * attackAddition;}void setAttackAddition(int attackAddition){this->attackAddition = attackAddition;}void effect(){cout<<"装备刀剑,获得额外攻击力加成:"<<attackAddition<<endl;aggressivity = aggressivity + 0.5 * attackAddition;}int attackAddition;  //攻击力加成
};

Main.cpp

#include<iostream>
#include<time.h>
#include"Sword.cpp"
#include"Arrow.cpp"
using namespace std;int main(){srand((unsigned)time(NULL));//设置随机数种子,使每次是否产生暴击不同Sword sword("无尽之刃", /**攻击力*/ 70 , /**暴击率*/ 0.25 , /**攻击距离*/ 200 , /**耐久度*/ 100 , /**攻击力加成*/ 50);sword.effect();Arrow arrow("逐日之弓" , /**攻击力*/ 50 , /**暴击率*/ 0.2 , /**攻击距离*/ 300 , /**耐久度*/ 100 , /**攻击速度加成*/ 0.3);arrow.effect();sword.attack(arrow);cout<<endl;arrow.attack(sword);cout<<endl;arrow.attack(sword);return 0;
}

【实验结果】

【小结或讨论】
本次实验是实验七 类的继承(1),主要内容是设计父类及派生类。第一题是以动物类为父类进行派生,我主要为动物类写了一个头文件Animal.h和一个类文件Animal.cpp,实现动物共有的功能有吃东西、睡觉、叫声,其中睡觉用rand()随机函数产生了睡觉时间,用Sleep()函数模拟睡觉。之后派生了三个子类,狗:Dog.cpp,增加了睡觉的时间、起床的时间等成员变量,还有嗅觉、起早贪黑的作息时间等成员函数;老鼠:Mouse.cpp,增加了反应距离、奔跑速度等成员变量,还有找东西吃、呼救等成员函数;猫:Cat.cpp,增加了品种、奔跑速度等成员变量,还有猫抓老鼠狗来救老鼠的函数,随机产生猫和老鼠的距离,猫来捉老鼠,之后随机产生狗来救老鼠需要的时间,决定老鼠是会被狗救还是被猫吃掉。
第二题是设计一个表示武器的父类,并实现至少两个子类。我主要为武器类Weapon.cpp写了名字、攻击力、暴击率、攻击距离、耐久度等成员变量,以及各成员变量的生成器和构造器函数,还有就是基类对象之间的攻击函数。然后是两个子类:弓箭类Arrow.cpp,增加了攻击速度的成员变量,还有特殊效果的函数:装备弓箭,攻击距离加100;刀剑类Sword.cpp,增加的额外攻击力加成这个成员函数,还有特殊效果的函数:装备刀剑,获得额外攻击力加成。主程序测试类main.cpp中主要调用了攻击类,由类型兼容规则,使用子类Arrow和Sword声明的子类对象隐含转换为基类对象,调用攻击函数,相互攻击,由攻击距离决定能否攻击到,由暴击率决定攻击力是否翻倍,由攻击力决定胜负。

C++实验七——类的继承(1)相关推荐

  1. 实验三 类的继承和多态性

    实验三 类的继承和多态性 1.(1)编写一个接口ShapePara,要求: 接口中的方法: int getArea():获得图形的面积.int getCircumference():获得图形的周长 ( ...

  2. C++实验八——类的继承(2)

    实验报告 题目1 题目2 [实验名称] 实验八 类的继承(2) [实验内容] 题目1 正确使用类的继承和组合进行类的设计,分别表示房间.休息室.教室.投影仪,沙发,为每个类设置适当的成员变量.成员函数 ...

  3. java实验33 类的继承2_java实验2 类的继承性

    实验2 类的继承性 一.实验目的 掌握面向对象的继承性在Java中的实现方法:掌握super关键字的用法,体会抽象类和抽象方法的作用. 二.实验内容 1.程序理解: 1)类的继承 2)第4章课后编程第 ...

  4. java类接口实验_实验3_Java类的继承和接口的定义和使用

    本次有三题:学会Java类的继承.接口的定义和使用 // Ex3_1.java /** * 题目要求: * 修改例5.7(P95)实现在页面中拖动鼠标画出矩形,矩形的对角线为点击并拖动鼠标形成的直线线 ...

  5. 实验5 类的继承、派生和多态(2)

    1.设计并实现一个机器宠物类MachinePets. #include<iostream> #include<string> using namespace std; clas ...

  6. java人学生大学生类的继承,java实验报告7.doc

    java实验报告7.doc 实 验 报 告( 2014 / 2015学年 第2学期)课程名称JAVA程序设计实验名称 类的继承实验时间2015年4月30日指导单位计算机学院/软件学院软件工程系指导教师 ...

  7. 实验四 类和对象;类的继承和派生;多态性; 接口;构造器应用

    实验四 类和对象:类的继承和派生:多态性: 接口:构造器应用 一.实验目的 1. 掌握类与对象的关系: 2. 掌握类的定义: 3. 掌握对象的声明及使用: 4. 掌握构造方法的概念及调用时机: 5. ...

  8. 实验四:继承性和派生类 建一个楼房Building为基类,建立住宅类House继承Building,存储房号和面积,建立办公室类Office继承Building,存储办公室名称和电话

    /* * 实验四:继承性和派生类 * 内容提要:建立一个楼房基类Building为基类,用于存储地址和楼号 * 建立住宅类House继承Building, 用来存储房号和面积, * 另外建立办公室类O ...

  9. 【C++】实验七 继承与派生

    文章目录 实验七(第八章)实践题一 实验七(第八章) 实践题二 实验七(第八章) 实践题三 实验七(第八章)实践题一 对本章示范题的用于管理商店商品的实现程序进行完善:完成Wardrobe立柜类的具体 ...

最新文章

  1. 【原】storm源码之一个class解决nimbus单点问题
  2. 数据挖掘之离群点检测
  3. UML建模之业务处理模型(Business Process Model,BPM)
  4. RabbitMQ学习二
  5. 《对不队》团队项目用户验收评审
  6. 福禄克Fluke Pro3000 音频发生器和探头
  7. php event_base_new,php event拓展基本使用
  8. Exp3 免杀原理与实践
  9. 紫书 习题8-14 UVa 1616(二分+小数化分数+精度)
  10. drools 7.x 领域语言dsl详细语法
  11. php语句导入mysql_php如何将数据库导入mysql
  12. 创建java普通工程 ( 4 )
  13. Linux之centos包管理rpm、yum、tar
  14. Java中常见的八种数据结构
  15. excel下拉公式保持一些参数不变
  16. 第八章 云计算原理与技术
  17. Baklib每日分享|在线产品手册的制作技巧
  18. FITS基本文件格式
  19. Linux 下摄像头驱动支持情况(arm linux 同样适用)
  20. Warning: Attempt to present ... on … which is already presenting null

热门文章

  1. 5G赋能行业园区数字化转型技术白皮书
  2. java spark k-means算法
  3. 用 Python 来全自动抢微信红包
  4. Apollo的启动步骤和客户端调用
  5. 视觉检测3D相机 平面度检测
  6. 编程语言摆地摊,我去逛了逛...
  7. 鸿蒙系统hifi,Apple Music将迎来重大更新 HiFi无损音质即将上线?
  8. 【Vue.js】Vue.js组件库Element中的单选框、多选框、输入框和计数器
  9. 奔跑吧火柴人c语言开发,奔跑吧火柴人手游-奔跑吧火柴人2019最新版下载v4.8.6-Minecraft中文分享站...
  10. 分布式文件系统FastDFS详解-附带视频教程