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.mzph.cn/web/6220.shtml

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

相关文章

leetCode65. 有效数字

leetCode65. 有效数字 题目思路 代码 class Solution { public:bool isNumber(string s) {int l 0, r s.size() - 1;// 1.忽略前后的空格while(l < r && s[l] ) l;while(l < r && s[r] ) r--;if(l > r) return false;s s.substr(l,r - l 1)…

Git的基本操作和使用

git分支指令 列出所有本地分支 git branchmaster是绿的 前面有个 表示当前分支是master* 列出所有远程分支 git branch -r列出所有本地分支和远程分支 git branch -a新建一个分支&#xff0c;但依然停留在当前分支 git branch [branch-name]新建一个分支&#xff0c;并切…

httpcanary抓包某游戏思路及教程[第1期]

游戏介绍&#xff1a; 这期在线读档0花购买教程&#xff0c;存档版教程。下一期在线购买无限鲜花累计充值安卓全系统适配修改教程。 小白勿入&#xff0c;技术流资料 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#x…

设计模式动态代理

什么是设计模式? 一个问题通常有n种解法&#xff0c;其中肯定有一种解法是最优的&#xff0c;这个最优的解法被人总结出来了&#xff0c;称之为设计模式。 设计模式有20多种&#xff0c;对应20多种软件开发中会遇到的问题。 关于设计模式的学习&#xff0c;主要学什么&#…

onedrive下載zip檔案有20G限制,如何解決

一般來說&#xff0c;OneDrive網頁版對文件下載大小的限制如下圖所示&#xff0c;更多資訊&#xff0c;請您參考這篇文章&#xff1a;OneDrive 和 SharePoint 中的限制 - Microsoft Support 因此我們推薦您使用OneDrive同步用戶端來同步到本地電腦&#xff0c;您也可以選擇只同…

MFC 列表控件删除实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例&#xff08;源码下载) 》 2、程序功能选中列表控件某一项&#xff0c;删除按钮由禁止变为可用&#xff0c;点击删除按钮&#xff0c;选中的项将删除。 3、首先在主界面添加一个删除参数按钮。 4、在myDlg.cpp 文件…

巨人网络发布2023年年报:全力拥抱AI浪潮,开启游戏产业新篇章

易采游戏网5月3日消息&#xff0c;国内知名游戏公司巨人网络发布了其2023年度财务报告&#xff0c;报告显示&#xff0c;公司在过去一年中积极拥抱AI技术&#xff0c;实现了业绩的稳步增长&#xff0c;为游戏产业带来了新的活力与机遇。 在报告中&#xff0c;巨人网络详细阐述了…

【C++】STL简介

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C 目录 前言什么是STL&#xff1f;STL的历史STL的版本STL六大组件STL的优缺点STL的优点&#xff1a;STL的缺点&#xff1a; 如何学习STL结语 前言 本篇博客主要内容&#xff1a;STL简介。…

240503-关于Unity的二三事

240503-关于Unity的二三事 1 常用快捷键 快捷键描述CtrlP播放/停止Ctrl1打开Scene窗口Ctrl2打开Game窗口Ctrl3打开Inspect窗口Ctrl4打开Hierarchy窗口Ctrl5打开Project窗口Ctrl6打开Animation窗口 2 关联VisualStudio2022 3 节约时间&#xff1a;将最新声明的参数移动到最上…

解决wget报错:ERROR 403: Forbidden.

原因&#xff1a; 服务器正在检查引用者&#xff0c;部分 HTTP 请求会得到错误响应。不以 Mozilla 开头或不包含 Wget 的用户代理的请求会被拒绝。 解决方案&#xff1a; wget --user-agent“Mozilla” 要下载的链接 如&#xff1a; wget --user-agent"Mozilla" …

jvm垃圾回收机制介绍

JVM&#xff08;Java虚拟机&#xff09;是Java程序的运行环境&#xff0c;它负责执行字节码文件。JVM的工作原理主要包括以下几个部分&#xff1a;类加载器、执行引擎、垃圾收集器和内存管理。类加载器负责加载字节码文件并将其转换成Java平台上的机器码&#xff0c;执行引擎负…

java入门-日期类

日期类 Date类 Date类表示特定的时间&#xff0c;可以精确到毫秒。 获取Date对象 Date date new Date(); 构造方法 /*** Allocates a <code>Date</code> object and initializes it so that* it represents the time at which it was allocated, measured to…

k8s笔记 | Ingress

安装Ingress 添加helm创库 Installation Guide - Ingress-Nginx Controller Ingress | Kubernetes 下载包 将 文件helm 放到 /usr/local/bin/ 并给到执行权限 # 添加可执行权限 chmod ux helm # 测试是否能运行 helm version# 结果 version.BuildInfo{Version:"v3.14…

详细分析Java中的敏感词过滤(附Demo)

目录 前言1. 简易Demo2. 进阶Demo 前言 敏感词直接过滤&#xff0c;有效防止敏感信息的上传 本文主要给一个启发的思路 1. 简易Demo 通过简易的Demo机制了解基本原理 import java.util.HashSet; import java.util.Set;public class test {private Set<String> sensi…

基于STM32的最小系统电路设计(STM32F103C8T6为例)

前言&#xff1a;本篇博客为嵌入式硬件领域的文章&#xff0c;对 STM32 的最小系统电路设计进行教学。本篇博客以嘉立创 EDA&#xff08;标准版&#xff09;进行绘制 STM32F103C8T6 的最小系统电路 PCB 板&#xff0c;STM32 的最小系统通常包括&#xff1a;微控制器、时钟电路、…

python从0开始学习

目录 前言 1、print函数 2、input函数 3、保留字和标识符 总结 前言 本篇文章我们开辟一个新的学习模块&#xff1a;python。python是一个十分简洁实用的编程语言&#xff0c;我们将从0开始学习python 1、print函数 print(*args, sep , end\n, fileNone, flushFalse) pytho…

ESP-01/01S 烧录固件

目录 一、ESP-01 与 ESP-01S 的区别二、ESP-01 与 ESP-01S 烧录 AT 固件1、模块接线a、管脚功能定义b、模组启动模式c、模块接线 2、下载 AT 固件3、下载固件烧录工具4、固件烧录步骤5、模块快速烧录 AT 固件 三、ESP-01 与 ESP-01S 发送 AT 指令1、模块接线2、上电信息3、发送…

硅片和SOI哪个研究方向更好?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;我研一将要结束&#xff0c;即将进入课题组。我们课题组方向有硅片和soi两种方向&#xff0c;这两种方向该如何选择呢&#xff1f; 硅片与…

Linux的Shell脚本详解

本文目录 一、什么是 Shell 脚本文件 &#xff1f;二、编写Shell脚本1. 基本规则2. shell 变量&#xff08;1&#xff09;创建变量&#xff08;2&#xff09;引用变量&#xff08;3&#xff09;删除变量&#xff08;4&#xff09;从键盘读取变量&#xff08;5&#xff09;特殊变…

Vulnhub-DIGITALWORLD.LOCAL: VENGEANCE渗透

文章目录 前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、smb下载线索三、制作字典四、爆破压缩包密码五、线索分析六、提权&#xff01;&#xff01;&#xff01; Vulnhub靶机&#xff1a;DIGITALWORLD.LOCAL: VENGEANCE ( digitalworld.local: VENGEANCE …