BJFUOJ-C++程序设计-实验3-继承和虚函数

A TableTennisPlayer

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

答案:

#include<iostream>
#include<cstring>
using namespace std;class TableTennisPlayer{
private:string firstname;string lastname;bool hasTable;public:TableTennisPlayer(const string &, const string &, bool);string FirstName() const;string LastName() const;bool HasTable() const;
};TableTennisPlayer::TableTennisPlayer(const string & fn, const string & ln, bool h)
{firstname=fn;lastname=ln;hasTable=h;
}string TableTennisPlayer::FirstName()const{ return firstname;
}string TableTennisPlayer::LastName()const{ return lastname;
}bool TableTennisPlayer::HasTable()const{return hasTable;
}class RatedPlayer :public TableTennisPlayer{
private:int rating;
public:RatedPlayer(int,const string &, const string &, bool);int Rating() const;
};RatedPlayer::RatedPlayer(int r,const string & fn, const string & ln, bool h):TableTennisPlayer(fn,ln,h)
{rating=r;
}int RatedPlayer::Rating() const
{return rating;
}int main(){string firstname, lastname;bool hasTable;int rating;char flag;while(cin>>flag){if(flag=='T'){cin>>firstname>>lastname>>hasTable;TableTennisPlayer tp(firstname,lastname,hasTable);if(tp.HasTable())cout<<tp.FirstName()<<" "<<tp.LastName()<<" has a table.\n";elsecout<<tp.FirstName()<<" "<<tp.LastName()<<" hasn't a table.\n";} else if(flag=='R'){		cin>>firstname>>lastname>>hasTable>>rating;RatedPlayer rp(rating,firstname,lastname,hasTable);if(rp.HasTable())cout<<rp.FirstName()<<" "<<rp.LastName()<<" has a table. The rating is "<<rp.Rating()<<".\n";elsecout<<rp.FirstName()<<" "<<rp.LastName()<<" hasn't a table. The rating is "<<rp.Rating()<<".\n";}}return 0;}

重要知识点:

·继承相关知识;
·派生类对象构造函数先调用父类构造函数,以及如何实现。

B Person和Student

在这里插入图片描述
在这里插入图片描述

答案:

#include<iostream>
#include<cstring>using namespace std;class Person{
private:string name;
public:virtual void input();virtual void display();
};void Person::input()
{cin>>name;
}void Person::display()
{cout<<name<<endl;
}class Student:public Person{
private:string id;
public:void input();void display();
};void Student::input()
{cin>>id;Person::input();
}void Student::display()
{cout<<id<<" ";Person::display();
}int main(){Person * p;p = new Person;p->input();p->display();delete p;p = new Student;p->input();p->display();delete p;return 0;
}

重要知识点:

·多态(主函数中体现)
·虚函数的定义与在子类中的实现(virtual关键字)
·赋值兼容规则是指在公有继承情况下,对于某些场合,一个派生类的对象可以
作为基类对象来使用。即:公有派生类的对象可以赋值给一个基类对象,并自
动转换为基类类型。 但基类对象只能“看到”其所替代的派生类对象中的基类部分。

C 图书商品

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

答案:

#include<iostream>using namespace std;class Item_base //未打折的图书商品
{
protected:string ISBN; //图书序列号double price; //单价public:Item_base(const string & book_ISBN = "", double sales_price = 0.0);string get_ISBN() const;virtual double net_price(int) const; //返回购买指定数量的图书的总价virtual ~Item_base();
};Item_base::Item_base(const string & book_ISBN, double sales_price)
{ISBN=book_ISBN;price=sales_price;
}string Item_base::get_ISBN()const
{return ISBN;
}double Item_base::net_price(int n) const
{return price*n;
}Item_base::~Item_base(){
}class Bulk_Item : public Item_base //根据购买数量打折
{
public:Bulk_Item(const string & book_ISBN = "", double sales_price = 0.0, int min_qty = 0, double discount = 0.0);double net_price(int) const; //返回根据购买数量打折后的总价
private:int min_qty; // 买够这个数量可以打相应的折扣double discount; //折扣
};Bulk_Item::Bulk_Item(const string & book_ISBN, double sales_price, int min_qty, double discount):Item_base(book_ISBN,sales_price)
{this->min_qty=min_qty;this->discount=discount;
}double Bulk_Item::net_price(int n)const
{return price*n*(1.0-discount);
}int main()
{Item_base book("0-001-0001-1", 10.0);Bulk_Item bulk1("0-001-0001-1",10.0, 5, 0.1);Bulk_Item bulk2("0-001-0001-1", 10.0, 10, 0.2);int num;while (cin >> num){cout << bulk1.get_ISBN() << "\t" << num << "\t";Item_base * p;if (num >= 10) p = &bulk2;else if (num >= 5) p = &bulk1;else p = &book;cout << p->net_price(num) << "\n";}return 0;
}

重要知识点

·虚函数:
(1)只有类的普通成员函数或析构函数才能声明为虚函数。
(2)基类中的虚函数可以在派生类中被重新定义,但重新定义时必须与基类中的函数原型完全相同(同名覆盖),且无论是否用virtual修饰,系统都将其视为虚函数(建议加上virtual)。
(3)当一个类的公有成员函数声明为虚函数,且在其公有派生类中被同名覆盖时:

 当用基类指针(或引用)指向这个派生类对象,并用该指针调用该函数时,系统自动用派生类中
的同名函数。

 即:当用基类指针(或引用)指向派生类对象,并用该指针调用该函数时,系统会在程序运行中根据所指向对象的不同,自动选择执行当前指向对象所属类的成员函数,从而实现了运行时的多
态性。
(5)静态成员函数不能声明为虚函数。因为静态成员函数不属于某一个对象,没
有多态性的特征。
(6)构造函数不能是虚函数。
(7)析构函数可以是虚函数,且往往被声明为虚函数。

D Vehicle类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

答案:

#include<iostream>using namespace std;class Vehicle{
protected:string name;string color;
public:Vehicle(string ,string);virtual void display()=0;
};Vehicle::Vehicle(string n,string c)
{name=n;color=c;
}class Car:public Vehicle{
private: int passenger;
public:Car(string,string,int);void display();
};Car::Car(string n,string c,int num):Vehicle(n,c)
{passenger=num;
}void Car::display()
{cout<<"Car name:"<<name<<" Car color:"<<color<<" Car passenger:"<<passenger<<endl;
}class Truck:public Vehicle{
private: double capacity;
public:Truck(string,string,double);void display();
};Truck::Truck(string n,string c,double m):Vehicle(n,c)
{capacity=m;
}void Truck::display()
{cout<<"Truck name:"<<name<<" Truck color:"<<color<<" Truck capacity:"<<capacity<<endl;
}int main()
{Vehicle *p;char type;char name[110],color[110];int pas;double cap;while(cin>>type){cin>>name>>color;if(type == 'C'){cin>>pas;Car car(name,color,pas);p = &car;p->display();}else if(type == 'T'){cin>>cap;Truck truck(name,color,cap);p = &truck;p->display();}}
return 0;
}

重要知识点:

·纯虚函数:
在定义一个表达抽象概念的基类时,有时可能会无法给出某些成员
函数的具体实现。这时,就可以将这些函数声明为纯虚函数。

virtual 类型 函数名(参数表)=0 ;

 即纯虚函数就是在基类中声明为虚函数,但未给出具体函数定义体的函数

 在各派生类中对该虚函数进行同名覆盖(即重写)。

·抽象类:
类体内声明了纯虚函数的类,称为抽象类。

 抽象类的主要作用:以此类为基类建立的一个类族具有一组公共的接口(即公
有成员函数),将它们定义为纯虚函数,使它们能够更有效地发挥多态特性。

 抽象类声明了一族派生类的共同接口,而接口的完整实现,即纯虚函数的函数

体,要由派生类自己定义。

·使用纯虚函数与抽象类的注意事项:
(1)抽象类只能用作基类来派生出新类,不能声明抽象类的对象,但可以声明指向抽象类的指针
变量或引用变量。

(2)抽象类中可以有多个纯虚函数。

(3)抽象类中也可以定义其他非纯虚函数。

(4)抽象类派生出新类之后,如果在派生类中没有重新定义基类中的纯虚函数,则必须再将该虚
函数继续声明为纯虚函数,此时,这个派生类仍然是一个抽象类;

(5)在一个复杂的类继承结构中,越上层的类抽象程度就越高,有时甚至无法给出某些成员函数
的具体实现。
(6)引入抽象类的目的主要是为了能将相关类组织在一个类继承结构中,并通过抽象类来为这些
相关类提供统一的操作接口。

E 表面积和体积

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

答案:

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;const double pi = acos(-1);class Shape {
public:
Shape() {}
virtual double area() = 0;
virtual void input() = 0;
virtual double volume() = 0;
virtual ~Shape() {}
};class Cylinder:public Shape
{
private:int r;int h;
public:double area();void input();double volume();
};double Cylinder::area()
{return pi*r*r*2+2*pi*r*h;
}void Cylinder::input()
{cin>>r>>h;
}double Cylinder::volume()
{return pi*r*r*h;
}class Cuboid:public Shape
{
private:int a;int b;int c;
public:double area();void input();double volume();
};double Cuboid::area()
{return 2*a*b+2*a*c+2*b*c;
}void Cuboid::input()
{cin>>a>>b>>c;
}double Cuboid::volume()
{return a*b*c;
}class Ball:public Shape
{
private:int r;
public:double area();void input();double volume();
};double Ball::area()
{return 4.0*pi*r*r;
}void Ball::input()
{cin>>r;
}double Ball::volume()
{return (4.0/3.0)*pi*r*r*r;
}void work(Shape *s) {s->input();cout << s->area() << " " << s->volume() << endl;delete s;
}int main() {char c;while (cin >> c) {switch (c) {case 'y':work(new Cylinder());break;case 'c':work(new Cuboid());break;case 'q':work(new Ball());break;default:break;}}return 0;
}

重要知识点:

同上

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

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

相关文章

深入剖析Tomcat(五) 剖析Servlet容器并实现一个简易Context与Wrapper容器

上一章介绍了Tomcat的默认连接器&#xff0c;后续程序都会使用默认连接器。前面有讲过Catalina容器的两大块内容就是连接器与Servlet容器。不同于第二章的自定义丐版Servlet容器&#xff0c;这一章就来探讨下Catalina中的真正的Servlet容器究竟长啥样。 四种容器 在Catalina中…

实现优先队列——C++

目录 1.优先队列的类模板 2.仿函数的讲解 3.成员变量 4.构造函数 5。判空&#xff0c;返回size&#xff0c;返回队头 6.插入 7.删除 1.优先队列的类模板 我们先通过模板来进行初步了解 由上图可知&#xff0c;我们的模板里有三个参数&#xff0c;第一个参数自然就是你要存储的数…

读天才与算法:人脑与AI的数学思维笔记16_音乐图灵测试

1. 艾米 1.1. 人工智能作曲家 1.1.1. 分析机可能会生成任意复杂程度、精细程度的科学的音乐作品 1.1.1.1. 阿达洛夫莱斯 1.1.2. 巴赫的作品是大多数作曲家开始学习创作的起点&#xff0c;也是大多数计算机开始学习作曲的起点…

uniapp 短视频浏览组件(仿抖音、上滑下滑)组件 Ba-VideoSView

简介&#xff08;下载地址&#xff09; Ba-VideoSView 是一款uniapp短视频上划浏览组件&#xff0c;支持无限滑动加载&#xff0c;支持自定义界面&#xff08;功能遮罩&#xff09;,支持点播、直播。 支持无限滑动加载支持自定义界面&#xff08;遮罩&#xff09;支持监听上滑…

第 8 章 机器人平台设计(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 学习到当前阶段大家对ROS已经有一定的认知了&#xff0c;但是之前的内容更偏理论&#xff0c;尤其是介绍完第6…

KKView远程控制2.0版本发布,TeamViewer面临巨大挑战

KKView远程控制2.0版本发布&#xff0c;TeamViewer面临巨大挑战 近日&#xff0c;备受瞩目的远程控制软件KKView发布了其全新2.0版本&#xff0c;KKView以其独特的创新性和用户友好的设计&#xff0c;为远程办公、远程培训等领域提供了更加高效、便捷的解决方案。 KKView远程…

K8S 哲学 - deployment -- kubectl【create 、 rollout 、edit、scale、set】

kubectl create kubectl rollout kubectl edit kubectl set kubectl scale 1、创建与配置文件解析 2、deploy 滚动更新 &#xff1a;template 里面的内容改变触发滚动更新 编辑该 deploy 的 配置文件 &#xff0c;加入一个 label 不会触发滚动更新 改变 nginx镜…

分布式与一致性协议之Raft算法(一)

Raft算法 概述 Raft算法属于Multi-Paxos算法&#xff0c;它在兰伯特Multi-Paxos思想的基础上做了一些简化和限制&#xff0c;比如日志必须是连续的&#xff0c;只支持领导者(Leader)、跟随者(Follwer)和候选人(Candidate)3种状态。在理解和算法实现上&#xff0c;Raft算法相对…

Python语言零基础入门——文件

目录 一、文件的基本概念 1.文件 2.绝对路径与相对路径 3.打开文件的模式 二、文件的读取 三、文件的追加 四、文件的写入 五、with语句 六、csv文件 1.csv文件的读取 2.csv文件的写入 七、练习题&#xff1a;实现日记本 一、文件的基本概念 1.文件 文件是以计算…

浏览器安装路径位置的查看、指定网址快捷方式的创建

浏览器安装路径位置的查看、指定网址快捷方式的创建 浏览器安装路径位置的查看 法一、属性查看法 右键点击浏览器的桌面图标&#xff0c;选择“属性”&#xff0c;“快捷方式”页中的“目标”框中可见. 以Microsoft Edge浏览器为例&#xff0c;参见下图&#xff1a; 法二、地…

免费开源语音克隆-GPT-SoVITS-WebUI只需 5 秒的声音样本

语音克隆-GPT-SoVITS-WebUI 强大的少样本语音转换与语音合成Web用户界面。 功能&#xff1a; 零样本文本到语音&#xff08;TTS&#xff09;&#xff1a; 输入 5 秒的声音样本&#xff0c;即刻体验文本到语音转换。 少样本 TTS&#xff1a; 仅需 1 分钟的训练数据即可微调模型…

LabVIEW换智能仿真三相电能表研制

LabVIEW换智能仿真三相电能表研制 在当前电力工业飞速发展的背景下&#xff0c;确保电能计量的准确性与公正性变得尤为重要。本文提出了一种基于LabVIEW和单片机技术&#xff0c;具有灵活状态切换功能的智能仿真三相电能表&#xff0c;旨在通过技术创新提高电能计量人员的培训…

基于SpringBoot+Vue的旅游网站系统

初衷 在后台收到很多私信是咨询毕业设计怎么做的&#xff1f;有没有好的毕业设计参考?能感觉到现在的毕业生和当时的我有着同样的问题&#xff0c;但是当时的我没有被骗&#xff0c;因为现在很多人是被骗的&#xff0c;还没有出学校还是社会经验少&#xff0c;容易相信别人。…

项目管理-项目进度管理2/3

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 项目进度管理&#xff1a;需掌握 ITTO, 搞懂计算图&#xff0c;问题和解决方案。 项目进度管理6个过程&#xff0c;包括&#xff08;口…

机器学习:深入解析SVM的核心概念【二、对偶问题】

对偶问题 **问题一&#xff1a;什么叫做凸二次优化问题&#xff1f;而且为什么符合凸二次优化问题&#xff1f;**为什么约束条件也是凸的半空间&#xff08;Half-Space&#xff09;凸集&#xff08;Convex Set&#xff09;半空间是凸集的例子SVM 约束定义的半空间总结 **问题二…

nginx的前世今生(二)

书接上回&#xff1a; 上回书说到&#xff0c;nginx的前世今生&#xff0c;这回我们继续说 3.缓冲秘籍&#xff0c;洪流控水 Nginx的缓冲区是其处理数据传输和提高性能的关键设计之一&#xff0c;主要用于暂存和管理进出的数据流&#xff0c;以应对不同组件间速度不匹配的问题…

Dokcer容器分布式搭建LNMP+wordpress论坛

目录 引言 一、架构环境 二、搭建容器 &#xff08;一&#xff09;自定义网络 &#xff08;二&#xff09;搭建nginx容器 1.文件准备 2.查看与编辑文件 3.生成镜像 4.创建容器 &#xff08;三&#xff09;搭建MySQL容器 1.文件准备 2.查看与编辑文件 3.生成镜像 …

基于Unity+Vue通信交互的WebGL项目实践

unity-webgl 是无法直接向vue项目进行通信的&#xff0c;需要一个中间者 jslib 文件 jslib当作中间者&#xff0c;unity与它通信&#xff0c;前端也与它通信&#xff0c;在此基础上三者之间进行了通信对接 看过很多例子&#xff1a;介绍的都不是很详细&#xff0c;不如自己写&…

【银角大王——Django课程——用户表的基本操作】

Django课程——用户表的基本操作 模板的继承用户管理用户列表展示新建用户Django组件原始方法【麻烦&#xff0c;太原始】form组件modelform组件 使用modelsform组件编写添加页面 模板的继承 &#xff08;1&#xff09;先写一个页面模板————这个案例中的模板基本上就是一个…

分布式与一致性协议之CAP和Paxos算法(一)

CAP 理论 如何使用BASE理论 以InfluxDB系统中DATA节点的集群实现为例。DATA节点的核心功能是读和写&#xff0c;所以基本可用是指读和写的基本可用。我们可以通过分片和多副本实现读和写的基本可用。也就是说&#xff0c;将同一业务的数据先分片&#xff0c;再以多份副本的形…