C++ 上机实验(二)【继承与多态】
一、实验目的和要求:
1、学习定义和使用类的继承关系,定义派生类;
2、熟悉不同继承方式下对基类成员的访问控制;
3、掌握在派生类中初始化基类成员的方法;
4、掌握C++函数的重载机制;
5、掌握使用虚函数实现动态多样性。
二、实验内容:
2.1、定义一个人员类Person,包括姓名、编号、性别等数据成员和用于输入、输出的成员函数,在此基础上派生出学生类Student类(增加成绩)和教师类Teacher(增加教龄),并实现对学生和教师信息的输入和输出。
#include<iostream>
using namespace std;
class Person
{
public:Person(string con_name,int con_id,string con_sex){name=con_name;id=con_id;sex=con_sex;}string getname(){return name;}int getid(){return id;}string getsex(){return sex;}
private:string name;int id;string sex;
};
class Student:public Person
{
public:Student(string nam,int d,string x,int con_grade):Person(nam,d,x){grade=con_grade;}int getgrade(){return grade;}void printstudent(){cout<<getname()<<endl;cout<<getid()<<" "<<getsex()<<" "<<getgrade()<<endl;}
private:int grade;
};
class Teacher:public Person
{
public:Teacher(string nam,int d,string x,int con_teachtime):Person(nam,d,x){teachtime=con_teachtime;}int getteachtime(){return teachtime;}void printTeacher(){cout<<getname()<<endl;cout<<getid()<<" "<<getsex()<<" "<<getteachtime()<<endl;}
private:int teachtime;
};
int main()
{Student stu("李明",20,"男",98);stu.printstudent();Teacher tea("张三",35,"男",7);tea.printTeacher();return 0;
}
2.2、定义一个抽象类Shape,包含两个纯虚函数Area(计算面积)和SetShape(重设形状大小)。然后派生出三角形类Triangle、矩形Rect类、圆Circle类,分别求面积。最后定义一个Total_Area类,计算这几个形状的面积之和,各形状的数据通过Total_Area类构造函数或成员函数来设置。编写一个完整的程序。
#include<iostream>
#include<vector>
using namespace std;
const double PI=3.1415926;
class Shape
{
public:virtual double Area()=0;//声明纯虚函数,显示形状面积virtual void setShape(double,double)=0;virtual void setShape(double)=0;
};
class Triangle:public Shape
{
public:double Area(){//cout<<"Triangle的面积:"<<0.5*xx*yy<<endl;return 0.5*xx*yy;}void setShape(double){};void setShape(double con_x,double con_y){xx=con_x;yy=con_y;// cout<<"Triangle的底和高分别是:";//cin>>this->xx>>this->yy;}
protected:double xx,yy;
};
class Rect:public Shape
{
public:double Area(){//cout<<"Rect的面积:"<<len*wid<<endl;return len*wid;}void setShape(double){};void setShape(double con_len,double con_wid){len=con_len;wid=con_wid;// cout<<"Rect的长和宽分别是:";// cin>>this->len>>this->wid;}
protected:double len,wid;
};
class Circle:public Shape
{
public:double Area(){// cout<<"Circle的面积:"<<rad*rad*PI<<endl;return rad*rad*PI;}void setShape(double,double){};void setShape(double con_rad){rad=con_rad;// cout<<"Circle的半径是:";//cin>>this->rad;}
protected:double rad;
};
class total_area
{
public:
// total_area(){};
// ~total_area(){};double get_totalarea(){double sum=0;
// for(int i=0;i<3;i++)
// sum+=p[i]->Area();for(int i=0;i<shapevec.size();i++)sum+=shapevec[i]->Area();return sum;}void addShape(Shape* pShape){//p[k]=pShape;shapevec.push_back(pShape);}
protected://Shape *p[3];vector<Shape*> shapevec;
};
int main()
{total_area TotalArea;Shape *ptr[3];int pos=0;ptr[0]=new Triangle();ptr[0]->setShape(10,5);TotalArea.addShape(ptr[0]);cout<<"Triangle的面积:"<<ptr[0]->Area()<<endl;ptr[1]=new Rect();ptr[1]->setShape(10,5);TotalArea.addShape(ptr[1]);cout<<"Rect的面积:"<<ptr[1]->Area()<<endl;ptr[2]=new Circle();ptr[2]->setShape(10);TotalArea.addShape(ptr[2]);cout<<"Circle的面积:"<<ptr[2]->Area()<<endl;cout<<"总面积:"<<TotalArea.get_totalarea()<<endl;for(int i=0;i<3;i++)delete ptr[i];return 0;
}
2.3、开发一个简单的大学人员管理程序。该程序可以管理大学的一些基本人员信息:学生(student)和教师(teacher)、教授(professor)。先设计一个虚基类person,通过该类描述人员的基本信息:姓名(name)、年龄(age)和性别(sex)等。然后使用该类派生出学生类student和教师类teacher,在其中添加各自的特征。如在student类中添加专业(speciality),在teacher类中添加院系(department)等。还有部分教师在工作的同时,在职攻读学位,因此具有教师和学生双重身份,由student类和teacher类再次派生出strTeacher类。为每个类定义一个输出函数print()输出该类的相关信息。
#include<iostream>
using namespace std;
class person
{
public:person(string con_name,int con_age,string con_sex){name=con_name;age=con_age;sex=con_sex;}void display(){cout<<"姓名:"<<name<<" 年龄:"<<age<<" 性别:"<<sex<<endl;}
protected:string name;int age;string sex;
};
class student:virtual public person
{
public:student(string m_name,int m_age,string m_sex,string m_speciality):person(m_name,m_age,m_sex){speciality=m_speciality;}void display(){person::display();cout<<"专业:"<<speciality<<endl;}
private:string speciality;//专业
};
class teacher:virtual public person
{
public:teacher(string m_name,int m_age,string m_sex,string m_department):person(m_name,m_age,m_sex){department=m_department;}void display(){person::display();cout<<"院系:"<<department<<endl;}
private:string department;//院系
};
class stuTeacher:public student,teacher
{
public:stuTeacher(string s_name,int s_age,string s_sex,string s_speciality,string t_name,int t_age,string t_sex,string t_department):student(s_name,s_age,s_sex,s_speciality),teacher(t_name,t_age,t_sex,t_department),person(s_name,s_age,s_sex){person::display();student::display();teacher::display();}void print_person(){cout<<name<<" "<<age<<" "<<sex<<endl;}
private:};
int main()
{stuTeacher ST("小明",25,"男","物联网工程","小明",28,"男","计算机");ST.print_person();return 0;
}
大学人员管理程序如果要完善的话,要添加的东西有很多,有些细节和要加的东西还不是很明确,自己写残了,仅供参考,下面是借鉴别人的。
借鉴于:https://wenku.baidu.com/view/fa2010ecb8f67c1cfad6b8ca.html
#include<iostream>
using namespace std;
class Person
{
private:
//学生有 名字 姓名 年龄属性char *name;char * sex;int age;
public:/*封装一下*/Person(){}void setName(char *name2){name = name2;}char* getName(){return name;}void setSex(char *sex2){sex = sex2;}char* getSex(){return sex;}void setAge(int age2){age = age2;}int getAge(){return age;}
//print函数void print();
};
void Person::print()
{cout<<"姓名为:"<<name<<",年龄为:"<<age<<",性别为:"<<sex<<endl;
}
class Student:public Person
{
protected:Student() {}
private:char *speciality;
public:Student(char *name2,char *sex2,int age2,char *speciality2){setName(name2);setSex(sex2);setAge(age2);setSpeciality(speciality2);}void setSpeciality(char *speciality2){speciality = speciality2;}char* getSpeciality(){return speciality;}
//print函数void print();
};
void Student::print()
{cout<<"姓名为:"<<getName()<<",年龄为:"<<getAge()<<",性别为:"<<getSex()<<",专业为:"<<getSpeciality()<<endl;
}
class Teacher:public Person
{
protected:Teacher() {}
private:char *department;
public:Teacher(char *name2,char *sex2, int age2,char* department2){setName(name2);setSex(sex2);setAge(age2);setDepartment(department2);}void setDepartment(char *department2){department = department2;}char* getDepartment(){return department;}
//print 函数void print();
};
void Teacher::print()
{cout<<"姓名为:"<<getName()<<",年龄为:"<<getAge()<<", 性别为:"<<getSex()<<"部门为:"<<getDepartment()<<endl;
}
class strTeacher:public Student,public Teacher
{
public:strTeacher(char *name2,char *sex2, int age2,char *speciality,char *department2){Teacher::setName(name2);Teacher::setSex(sex2);Teacher::setAge(age2);setSpeciality(speciality);setDepartment(department2);}
//print函数void print();
};
void strTeacher::print()
{cout<<"姓名为:"<<Teacher::getName()<<",年龄为:"<<Teacher::getAge()<<",性别 为 :"<<Teacher::getSex()<<",专业为:"<<getSpeciality()<<"部门为 :"<<getDepartment()<<endl;
}
int main()
{cout<<"欢迎进入大学人员管理程序 "<<endl;Student student = Student("学生","man",21," 信息与计算科学");//创建一个学生对象Teacher teacher = Teacher("老师","woman",28,"理学院");//创建一个老师对象strTeacher stuTea=strTeacher("既是老师又是学生","man",25,"信息与计算科学","理学院");student.print();teacher.print();stuTea.print();return 0;
}
C++ 上机实验(二)【继承与多态】相关推荐
- 计算机在材料科学中的应用上机二,计算机在材料科学中的应用-上机实验二.doc...
计算机在材料科学中的应用-上机实验二 实验二 Office使用技巧 ? 1 Word工具栏的增删与了解其主要作用 (1) ? 把"常用"和"格式"工具栏打开(一 ...
- C#——《C#语言程序设计》实验报告——继承与多态——电视和电灯委托
一.实验目的 掌握C#中各种成员的写法: 掌握C#继承和多态概念: 掌握常用接口的使用方法. 二.实验内容 运用委托知识,完成以下程序: 有下面两个类,代表电视和电灯,设计两个委托,在Program类 ...
- C#——《C#语言程序设计》实验报告——继承与多态——银行ATM程序
一.实验目的 掌握C#中各种成员的写法: 掌握C#继承和多态概念: 掌握常用接口的使用方法. 二.实验内容 在银行ATM示例的基础上,利用面向对象的思想及语法,进行改进.要求如下: 1)使用面向对象的 ...
- C++实验_2:继承和多态
文章目录 实验背景 1.类的继承 1.1.继承访问权限测试 1.1.1.public, protected, private属性测试 1.1.2.类的继承方式区别(public, protected, ...
- Java实验3继承、多态
继承.多态(接口和包) 实验目的 (1) 掌握Java语言中继承和多态的相关概念 (2) 掌握Java程序设计中继承和多态机制的使用 (3) 掌握Java语言中接口和包的概念及使用 实验内容及要求 仿 ...
- 合肥工业大学2021汇编语言程序设计上机实验二
实验二 高级汇编程序设计 实验目的 1. 掌握中断服务子程序的编写. 2. 汇编语言与高级语言的混编. 实验内容 1.挂接1CH中断,正计时90秒后退出.要求屏幕显示0-89的秒数. 2.VC++中 ...
- 【Java程序设计】Java上机实验(二)
实验二.数组 一.实验目的: 1.学会使用一维与二维数组管理简单数据. 2.学会编写简单的菜单驱动(命令行式)的Java程序 二.实验环境: BLUEJ 三.实验内容: (写出主要的内容) 1 ...
- 林子雨—大数据技术原理与应用—上机实验二
题目:熟悉常用的HDFS操作 实验环境: 操作系统:ubuntu16.04 hadoop版本:1.2.1 JDK版本:1.8 Eclipse 3 ...
- C++上机实验二第2题
第2题 函数的默认参数 #include<iostream> #include<cstring> using namespace std;int display(string ...
- 大连理工大学操作系统上机实验二
编写一个多进程并发执行程序.父进程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制 ps 命令总在 ls 命令之前执行. #include<sys/types.h> ...
最新文章
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(31)-MVC使用RDL报表
- 北大韦神透露现状:自己课讲得不太好,中期学生退课后就剩下5、6个人...
- nodejs python 通信_Nodejs环境实现socket通信过程解析
- FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS
- c++ 解析xml文件
- 地铁框架保护的原理_继电保护的基础知识和原理(地铁)
- C++指针、this指针、静态成员
- octotree插件 --- 将 Github 项目代码以树形格式展示
- android语法高亮插件,安卓语法高亮编辑器 HighlightTextEditor
- 软件工程 实践者的研究方法 中文题答案
- 笔记本CPU处理器HQ,H,U,M,型号之间的区别
- 这几招教你如何增加食物中铁的吸收
- webstorm中使用nodemon
- 【python】OpenCV—RGB, Rectangle, Circle, SS(1)
- 【转】软件安装错误2203(The error code is 2203)
- 计算机导论课后总结3
- [渝粤教育] 九江学院 药理学 参考 资料
- 一个疑惑的的问题-ntvdm.exe进程
- 如何在scrapy中捕获并处理各种异常
- python的字典-使用字典+遍历字典+字典嵌套