C02-程序设计基础提高班(C++)第12周上机任务-类的继承

2024-03-03 11:08

本文主要是介绍C02-程序设计基础提高班(C++)第12周上机任务-类的继承,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

12周:阅读教材第11章(p347-394),主要内容是类的继承,完成第12周上机任务;

(回到C02-程序设计基础提高班(C++)学习安排)


【任务1】定义一个名为CPerson的类,有以下私有成员:姓名、身份证号、性别和年龄,成员函数:构造函数、析构函数、输出信息的函数。并在此基础上派生出CEmployee类,派生类CEmployee增加了两个新的数据成员,分别用于表示部门和薪水。要求派生类CEmployee的构造函数显示调用基类CPerson的构造函数,并为派生类CEmployee定义析构函数,定义输出信息的函数。

#include <iostream>
#include <string.h>
#include <iomanip>//setw:设置输出数据的宽度,使用时应#include <iomanip.h> 
using namespace std;
class CPerson 
{
protected:char *m_szName;char *m_szId;int m_nSex;//0:women,1:manint m_nAge;
public:CPerson(char *name,char *id,int sex,int age);void Show1();~CPerson();  //需要释放建立对象时动态分配的内存
};class CEmployee:public CPerson
{
private:char *m_szDepartment;float m_Salary;
public:CEmployee(char *name,char *id,int sex,int age,char *department,float salary);void Show2();~CEmployee();
};int main()
{char name[10],id[19],department[10];int sex,age;float salary;cout<<"input employee's name,id,sex(0:women,1:man),age,department,salary:\n";cin>>name>>id>>sex>>age>>department>>salary;CEmployee employee1(name,id,sex,age,department,salary);cout<<employee1.Show2();   system("pause");return 0;
}

参考的运行结果:

input employee's name,id,sex(0:women,1:man),age,department,salary:
Tom 370102198703255357 0 25 computer 2345.6
show employee information: 
      name                     id    sex    age        department    salary
       Tom     370102198703255357  women     25        computer      2345.6
请按任意键继续. . .

[ 参考:CEmployee类继承CPerson类 - http://blog.csdn.net/sxhelijian/article/details/7492226 ]

【任务2】
(1)先建立一个Point(点)类,包含数据成员x,y(坐标点);
(2)以Point为基类,派生出一个Circle(圆)类,增加数据成员 (半径);
(3)再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。
要求编写程序,设计出各类中基本的成员函数(包括构造函数、析构函数、修改数据成员和获取数据成员的公共接口、用于输出的重载运算符“<<”函数等),使之能用于处理以上类对象,最后求出圆格柱体的表面积、体积并输出。
(提示:此任务可以分为三个子任务分成若干步骤进行。先声明基类,再声明派生类,逐级进行,分步调试。——这种方法适用于做任何的项目)
[ 参考:由点到圆再到圆柱体 - http://blog.csdn.net/sxhelijian/article/details/7492421 ]


【任务3】(教材P394习题9)分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求: 
(1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。 
(2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_Cadre类中还包含数据成员wages(工资)。 
(3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。 
(4)在类体中声明成员函数,在类外定义成员函数。 
(5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、职称、地址、电话,然后再用cout语句输出职务与工资。
[ 参考:双肩挑干部 - http://blog.csdn.net/sxhelijian/article/details/7543916 ]

【任务4】在下面一段类的定义中,自行车类的虚基类为车辆类,机动车类的虚基类也为车辆类,摩托车类的基类为自行车类和机动车类,类之间均为公有继承。
(1)根据上面各类间关系的描述,补全下面程序段中空缺的代码
(2)实现程序中声明的成员函数,注意相应操作中的动作发生的条件不能满足时应给出提示。
(3)运行程序,享受开摩托的过程。(下载文件中提供了一个可执行文件"开摩托.exe",可以先运行再编程。不必申请驾照,这个摩托车很安全。)
(4)在报告中回答问题:本题中使用虚基类的好处是什么?
#include <iostream>
#include<conio.h>
#include <windows.h>
using namespace std;
enum vehicleStaus {rest, running};  //车辆状态:泊车、行进
class vehicle //车辆类
{
protected:int maxSpeed;		//最大车速int currentSpeed;	//当前速度int weight;			//车重vehicleStaus status; //rest-泊车状态;running-行进状态
public:vehicle(int maxS, int w); //构造函数,初始时,当前速度总为0且处在停车状态void start();  //由rest状态到running, 初速为1void stop(); //由running状态到rest, 当前速度小于5时,才允许停车void speed_up();  //加速,调用1次,速度加1void slow_down(); //减速,调用1次,速度减1,速度为0时,停车
};class bicycle :_____(1)_________//(1)自行车类的虚基类为车辆类
{ 
protected:double height; //车高
public:bicycle(int maxS=10, int w=50, int h=0.7);   //定义构造函数
};class motorcar : ______(2)__________//(2)机动车类的虚基类也为车辆类
{ 
protected:int seatNum; //座位数int passengerNum; //乘客人数
public:motorcar(int maxS=150, int w=1500, int s=5, int p=1);   //定义构造函数void addPassenger(int p=1);   //增加搭载的乘客,超员要拒载,有人下车时,p为负数。当然车上乘客至少有1个(司机)。只有车停稳后才能上下客。
};class motorcycle: ______(3)_________ //(3)摩托车类的基类为自行车类和机动车类
{ 
public://定义构造函数motorcycle(int maxS=90, int w=100, int s=3, int p=1, int h=0.7);   void show(); //显示摩托车的运行状态
};int main( )
{motorcycle m;bool end=false;while (!end){cout<<"请操作:1-启动  2-加速  3-减速  4-有人上车  5-有人下车  6-停车 0-结束"<<endl;char keydown= _getch(); //_getch()返回键盘上读取的字符switch(keydown){case '1': cout<<"操作(启动)\t"; m.start(); break;case '2':                         cout<<"操作(加速)\t"; m.speed_up(); break;case '3':                          cout<<"操作(减速)\t"; m.slow_down(); break;case '4':                        cout<<"操作(有人上车)\t"; m.addPassenger(); break;case '5':                      cout<<"操作(有人下车)\t"; m.addPassenger(-1); break;case '6':                      cout<<"操作(停车)\t"; m.stop(); break;case '0':               end=true; break;}m.show();cout<<endl;Sleep(200);  //要包含头文件<windows.h>}system("pause");return 0;
}
[ 参考:做个摩托车开一开 - http://blog.csdn.net/sxhelijian/article/details/7543948 ]

【任务5】类的组合与继承
(1)先建立一个Point(点)类,包含数据成员x,y(坐标点);
(2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心;
(3)编写上述两类中的构造、析构函数及必要的输入输出函数
(4)定义友元函数int locate,判断点p在圆c上、圆c内或圆c外,返回值<0圆内,==0圆上,>0 圆外;
(5)重载关系运算符(6种)运算符,使之能够按圆的面积比较两个圆的大小;
(6)给定一点p,求出该点与圆心相连成的直线与圆的两个交点并输出
下面给出用于测试的main()函数,涉及到的类请自行定义。
int main( )
{Circle c1(3,2,4),c2(4,5,5);      //c2应该大于c1Point p1(1,1),p2(3,-2),p3(7,3);  //分别位于c1内、上、外cout<<"圆c1: "<<c1;cout<<"点p1: "<<p1;cout<<"点p1在圆c1之"<<((locate(p1, c1)>0)?"外":((locate(p1, c1)<0)?"内":"上"))<<endl;cout<<"点p2: "<<p2;cout<<"点p2在圆c1之"<<((locate(p2, c1)>0)?"外":((locate(p2, c1)<0)?"内":"上"))<<endl;	cout<<"点p3: "<<p3;cout<<"点p3在圆c1之"<<((locate(p3, c1)>0)?"外":((locate(p3, c1)<0)?"内":"上"))<<endl;cout<<endl; cout<<"圆c1: "<<c1;if(c1>c2) cout<<"大于"<<endl;if(c1<c2) cout<<"小于"<<endl; if(c1>=c2) cout<<"大于等于"<<endl;if(c1<=c2) cout<<"小于等于"<<endl; if(c1==c2) cout<<"等于"<<endl; if(c1!=c2) cout<<"不等于"<<endl; cout<<"圆c2: "<<c1;cout<<endl; Point p4,p5;crossover_point1(p1,c1, p4, p5);cout<<"点p1: "<<p1;cout<<"与圆c1: "<<c1;cout<<"的圆心相连,与圆交于两点,分别是:"<<endl;cout<<"交点: "<<p4;cout<<"交点: "<<p5;cout<<endl; system("pause");return 0;
}

[ 参考:点类与圆类 - http://blog.csdn.net/sxhelijian/article/details/7544037 ]



    

这篇关于C02-程序设计基础提高班(C++)第12周上机任务-类的继承的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/769434

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现