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";
			else
				cout<<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";
			else
			cout<<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;
}

重要知识点:

同上

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jupyter notebook使用与本地位置设置

本地安装好Anaconda之后&#xff0c;自带的有Jupter notebook。 使用jupyter notebook 使用jupyter notebook时&#xff0c;可以直接打开或者搜索打开&#xff1a; 打开后&#xff0c;我们生成的或者编辑的一些文件&#xff0c;都可以看到&#xff0c;如下&#xff1a; j…

HTML标签大全

本文是用于解释文章中使用的标签&#xff0c;方便萌新理解标签结构&#xff0c;也方便大佬忘了过来查一下~ 本文根据博客教学进度实时更新&#xff0c;可以收藏一下~ 文章目录 第二篇1.template2.div3. button 第三篇4.ul5.li 第二篇 第二篇链接 1.template <template&g…

计算机408备考-数据结构重要知识点-数据结构的定义

请关注一下B站账号&#xff1a;谭同学很nice&#xff01;后期更新发布在这个账号上。。【计算机408备考-数据结构重要知识点-数据结构的定义-哔哩哔哩】https://b23.tv/x7shjNf 数据是信息的载体。数据元素是数据的基本单位。一个数据元素可由若干数据项组成&#xff0c;数据项…

利用大语言模型(KIMI)构建控制信息模型

数字化的核心是数字化建模&#xff0c;为一个事物构建数字模型是一项十分复杂的工作。不同的应用场景&#xff0c;对事物的关注重点的不同的。例如&#xff0c;对于一个智能传感器而言&#xff0c;从商业的角度看&#xff0c;产品的信息模型中应该包括产品的类型&#xff0c;名…

ESD管 AZ5825-01F国产替代型号ESDA05CPX

已经有很多客户选用雷卯的ESDA05CPX替代Amazing 的 AZ5825-01F&#xff0c; 客户可以获得更好的价格和更快的交期&#xff0c;主要应用于对5V供电和4.5V供电电流较大的Vbus线路插拔保护等。 雷卯ESDA05CPX优势&#xff1a; 带回扫 &#xff0c;钳位电压Vc 低&#xff0c;IPP为…

逻辑漏洞:水平越权、垂直越权靶场练习

目录 1、身份认证失效漏洞实战 2、YXCMS检测数据比对弱&#xff08;水平越权&#xff09; 3、MINICMS权限操作无验证&#xff08;垂直越权&#xff09; 1、身份认证失效漏洞实战 上一篇学习了水平越权和垂直越权的相关基本知识&#xff0c;在本篇还是继续学习&#xff0c;这…

利用亚马逊云科技GenAI企业助手Amazon Q Business构建企业代码开发知识库

2024年五一节假日的前一天&#xff0c;亚马逊云科技正式重磅发布了云计算行业期待已久的服务——Amazon Q Business。Amazon Q Business是专为企业用户打造的一个开箱即用的完善而强大企业GenAI助手。企业用户只需要将Amazon Q Business连接到现有的企业内部数据源&#xff0c;…

整合文本和知识图谱嵌入提升RAG的性能

我们以前的文章中介绍过将知识图谱与RAG结合的示例&#xff0c;在本篇文章中我们将文本和知识图谱结合&#xff0c;来提升我们RAG的性能 文本嵌入的RAG 文本嵌入是单词或短语的数字表示&#xff0c;可以有效地捕捉它们的含义和上下文。可以将它们视为单词的唯一标识符——捕获…

文件传送协议

壹、文件传输协议FTP 一、FTP简介 文件传送协议FTP曾是互联网上使用最广泛的协议&#xff1b; 在互联网发展的早期阶段&#xff0c;用FTP传送文件约占整个互联网的通信量的三分之一&#xff1b;知道1995年&#xff0c;www的通信量才首次超过FTP。 FTP实现的是通过网络实现异…

EasyRecovery2024汉化版电脑数据恢复软件下载

EasyRecovery是一款功能强大的数据恢复软件&#xff0c;其主要功能包括但不限于以下几点&#xff1a; 硬盘数据恢复&#xff1a;能够扫描本地计算机中的所有卷&#xff0c;建立丢失和被删除文件的目录树&#xff0c;实现硬盘格式化、重新分区、误删数据、重建RAID等硬盘数据恢…

基于GWO灰狼优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 4…

细说SVPWM原理及软件实现原理,关联PWM实现

细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现 文章目录 细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现1. 前言2. 基础控制原理回顾2.1 FOC 原理回顾2.2 细说 SVPWM2.2.1 矢量扇区计算2.2.2 矢量作用时间计算 2.2.3 如何理解 U4 U6 2/3Udc?2.2.4 如何理解 U4m…

Linux系统编程--信号与管道

1、信号与管道是什么&#xff1f; 首先了解信号与管道的意义&#xff0c;我们需要了解Linux系统中进程之间是如何通信的。Linux操作系统下&#xff0c;以进程为单位来分配或者管理资源&#xff0c;进程之间不能直接访问资源&#xff0c;因此&#xff0c;要求进程间的资源和信息…

上位机图像处理和嵌入式模块部署(树莓派4b与消息分发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和多线程相比较&#xff0c;多进程最大的好处就是安全。一个进程挂了&#xff0c;不影响其他进程的运行。但是多线程也有自己的优点&#xff0c;那…

Ex1-C6油气化工防爆轮式巡检机器人

Ex1系列防爆轮式巡检机器人整机采用防爆设计&#xff0c;防爆等级为Exd II CT4 Gb。机器人通过无轨3D形态导航技术&#xff0c;结合360度防爆云台和无线防爆充电桩&#xff0c;实现整套防爆标准&#xff0c;可广泛应用于石油、燃气、化工、冶金等II类爆炸环境中&#xff0c;代替…

程序员缓解工作压力——方法分享

前言 作为一名初级程序员&#xff0c;我承认自己在应对工作压力方面还有待提高。在日常工作中&#xff0c;我时常感到压力山大&#xff0c;尤其是在面对复杂问题或紧迫的项目期限时。然而&#xff0c;为了保持高效和持久的工作热情&#xff0c;我还是积极寻求并使用了一…

Python 贪吃蛇

文章目录 效果图&#xff1a;项目目录结构main.pygame/apple.pygame/base.pygame/snake.pyconstant.py 效果图&#xff1a; 项目目录结构 main.py from snake.game.apple import Apple # 导入苹果类 from snake.game.base import * # 导入游戏基类 from snake.game.snake im…

Linux之命令行参数与环境变量

命令行参数&环境变量 命令行参数 main函数也是一个函数&#xff0c;其实也可以携带参数的 int main( int argc, char *argv[ ], char *envp[ ] ) {program-statements } 那这里是有三个参数的: 第一个参数&#xff1a; argc 是个整型变量&#xff0c;表示命令行参数的个数…

WIFI/BT中蓝牙的硬件资源是如何调度的 UART和PCM接口传输的是什么信号

安卓或IOS手机中&#xff0c;wifi/bt中的蓝牙是如何调度硬件资源的&#xff0c;尤其是UART和PCM是如何分配的。M.2 wifi/bt模块或其他形式的模块中&#xff0c;蓝牙是如何调度硬件资源的&#xff0c;尤其是UART和PCM是如何分配的。今天我们就图文并茂的解决这个问题。 蓝牙文件…

SQL 基础 | AS 的用法介绍

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作数据库的标准编程语言。 在SQL中&#xff0c;AS关键字有几种不同的用法&#xff0c;主要用于重命名表、列或者查询结果。 以下是AS的一些常见用法&#xff1a; 重命名列&#xff1a;在SELECT语句中&a…