实验3 派生类与继承实验
1、实验目的
(1)掌握派生类的声明方法和派生类构造函数的定义方法;
(2)掌握不同继承方式下,基类成员在派生类中的访问属性;
(3)掌握在继承方式下,构造函数和析构函数的执行顺序与构造规则。
2、实验学时:6学时
3、实验内容
(1)编写一个学生和教师的数据输入和显示程序。学生数据有编号、姓名、性别、年龄、系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。要求将编号、姓名、性别、年龄的输入和输出设计成一个类Person,并作为学生类Student和教师类Teacher的基类。
int main()
{ Student stu(2015001,”李明”,”男”,20,”计算机”,90);
Teacher teac;
…………
}
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
class A
{
private:
int bianhao;
string name;
string sex;
int nianling;
public:
int getbianhao();
string getname();
string getsex();
int getnianling();
int outbianhao();
string outname();
string outsex();
int outnianling();
};
string A::getsex()
{
cout<<"scanf sex:";
cin>>sex;
return sex;
}
A::getbianhao()
{
cout<<"scanf bianhao:";
cin>>bianhao;
return bianhao;
}
string A::getname()
{
cout<<"scanf name:";
cin>>name;
return name;
}
A::getnianling()
{
cout<<"scanf nianling:";
cin>>nianling;
return nianling;
}
A::outbianhao()
{
cout<<"bianhao:"<<bianhao<<endl;
return bianhao;
}
string A::outname()
{
cout<<"name:"<<name<<endl;
return name;
}
A::outnianling()
{
cout<<"nian ling:"<<nianling<<endl;
return nianling;
}
string A::outsex()
{
cout<<"sex:"<<sex<<endl;
return sex;
}
class s:public A
{
private:
string xibie;
int score;
public:
string getxibie();
int getscore();
string outxibie();
int outscore();
};
string s::getxibie()
{
cout<<"scanf xibie:";
cin>>xibie;
return xibie;
}
s::getscore()
{
cout<<"scanf score:";
cin>>score;
return score;
}
string s::outxibie()
{
cout<<xibie;
return xibie;
}
s::outscore()
{
cout<<score;
return score;
}
class t:public A
{
private:
string zhicheng;
string bumen;
public:
string getzhicheng();
string getbumen();
string outzhicheng();
string outbumen();
};
string t::getzhicheng()
{
cout<<"scanf zhicheng:";
cin>>zhicheng;
return zhicheng;
}
string t::getbumen()
{
cout<<"scanf bumen:";
cin>>bumen;
return bumen;
}
string t::outzhicheng()
{
cout<<zhicheng;
return zhicheng;
}
string t::outbumen()
{
cout<<bumen;
return bumen;
}
int main()
{
s s1;
t t1;
s1.getbianhao();
s1.getname();
s1.getsex();
s1.getnianling();
s1.getxibie();
s1.getscore();
t1.getbianhao();
t1.getname();
t1.getsex();
t1.getnianling();
t1.getzhicheng();
t1.getbumen();
s1.outbianhao();
s1.outname();
s1.outsex();
s1.outnianling();
s1.outxibie();
s1.outscore();
t1.outbianhao();
t1.outname();
t1.outsex();
t1.outnianling();
t1.outzhicheng();
t1.outbumen();
system("pause");
return 0;
}
/*编写一个学生和教师的数据输入和显示程序。学生数据有编号、姓名、性别、年龄、系别和成绩,
教师数据有编号、姓名、性别、年龄、职称和部门。
要求将编号、姓名、性别、年龄的输入和输出设计成一个类Person,
并作为学生类Student和教师类Teacher的基类。*/
(2)按要求阅读、编辑、编译、调试和运行以下程序。
(1) 阅读、编辑、编译、调试和运行以下程序,并写出程序的运行结果。
#include <iostream>
#include <string>
using namespace std;
class MyArray //声明一个基类MyArray
{
public:
MyArray(int leng); //构造函数
~MyArray(); //析构函数
void Input(); //输入数据的成员函数
void Display(string); //输出数据的成员函数
protected:
int *alist; //基类中存放一组整数
int length; //整数的个数
};
MyArray::MyArray(int leng)
{ if (leng<=0)
{ cout<<”error length”;
exit(1);
}
alist=new int[leng];
length=leng;
if(alist==NULL)
{ cout<<”assign failure”;
exit(1);
}
cout<<”MyArray类对象已创建。”<<endl;
}
MyArray::~MyArray()
{ delete[] alist;
cout<<”MyArray类对象被撤销。”<<endl;
}
void MyArray::Input()
{ cout<<”请从键盘输入”<<length<<”个整数:”;
int i;
int *p=alist;
for(i=0;i<length;i++,p++) cin>>*p;
}
void MyArray::Display(string str)
{ int i;
int *p=alist;
cout<<str<<length<<”个整数:”;
for(i=0;i<length;i++,p++) cout<<*p<<” “;
cout<<endl;
}
int main()
{ MyArray a(5);
a.Input();
a.Display(“显示已输入的”);
return 0;
}
(2)声明一个类SortArray继承类MyArray,在该类中定义一个函数sort,具有将输入的整数从小到大进行排序的功能。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class MyArray //声明一个基类MyArray
{
public:
MyArray(int leng); //构造函数
MyArray();
~MyArray(); //析构函数
void Input(); //输入数据的成员函数
void Display(string); //输出数据的成员函数
protected:
int *alist; //基类中存放一组整数
int length; //整数的个数
};
MyArray::MyArray()
{}
MyArray::MyArray(int leng)
{ if (leng<=0)
{ cout<<"error length";
exit(1);
}
alist=new int[leng];
length=leng;
if(alist==NULL)
{ cout<<"assign failure";
exit(1);
}
cout<<"MyArray类对象已创建。"<<endl;
}
MyArray::~MyArray()
{
cout<<"MyArray类对象被撤销。"<<endl;
}
void MyArray::Input()
{ cout<<"请从键盘输入"<<length<<"个整数:";
int i;
int *p=alist;
for(i=0;i<length;i++,p++) cin>>*p;
}
void MyArray::Display(string str)
{ int i;
int *p=alist;
cout<<str<<length<<"个整数:";
for(i=0;i<length;i++,p++) cout<<*p<<" ";
cout<<endl;
}
class SortArray:public MyArray
{
public:
SortArray(int length):MyArray(length)
{
cout<<"对象已创建:"<<endl;
}
virtual ~SortArray();
int sort();
};
SortArray::~SortArray()
{
cout<<"SortArray对象被撤销:"<<endl;
}
int SortArray::sort()
{
int i,j;
int *p;
for(i=0;i<length;i++)
{
p=alist;
for(j=0;j<length-i-1;j++,p++)
{
if(*p>*(p+1))
swap(*p,*(p+1));
}
}
}
int main()
{ SortArray a(5);
a.Input();
a.Display("显示已输入的");
a.sort();
a.Display("显示排序后:");
return 0;
}
(3)声明一个类AverArray继承类MyArray,在该类中定义一个函数aver,具有求输入整数平均值的功能。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class MyArray //声明一个基类MyArray
{
public:
MyArray(int leng); //构造函数
MyArray();
~MyArray(); //析构函数
void Input(); //输入数据的成员函数
void Display(string); //输出数据的成员函数
protected:
int *alist; //基类中存放一组整数
int length; //整数的个数
};
MyArray::MyArray()
{}
MyArray::MyArray(int leng)
{ if (leng<=0)
{ cout<<"error length";
exit(1);
}
alist=new int[leng];
length=leng;
if(alist==NULL)
{ cout<<"assign failure";
exit(1);
}
cout<<"MyArray类对象已创建。"<<endl;
}
MyArray::~MyArray()
{
cout<<"MyArray类对象被撤销。"<<endl;
}
void MyArray::Input()
{ cout<<"请从键盘输入"<<length<<"个整数:";
int i;
int *p=alist;
for(i=0;i<length;i++,p++) cin>>*p;
}
void MyArray::Display(string str)
{ int i;
int *p=alist;
cout<<str<<length<<"个整数:";
for(i=0;i<length;i++,p++) cout<<*p<<" ";
cout<<endl;
}
class AverArray:public MyArray
{
public:
AverArray(int length):MyArray(length)
{
cout<<"对象已创建:"<<endl;
}
virtual ~AverArray();
int aver();
};
AverArray::~AverArray()
{
cout<<"AverArray对象被撤销:"<<endl;
}
int AverArray::aver()
{
int i,j;
int *p;
double sum=0,ave;
p=alist;
for(i=0;i<length;i++,p++)
{
sum=sum+*p;
}
ave=sum/length;
cout<<"平均数:"<<ave<<endl;
}
int main()
{
AverArray a(5);
a.Input();
a.Display("显示已输入的");
a.aver();
return 0;
}
(4)声明一个类ASArray继承类MyArray,包含有上述函数sort和aver的功能。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class MyArray //声明一个基类MyArray
{
public:
MyArray(int leng); //构造函数
MyArray();
~MyArray(); //析构函数
void Input(); //输入数据的成员函数
void Display(string); //输出数据的成员函数
protected:
int *alist; //基类中存放一组整数
int length; //整数的个数
};
MyArray::MyArray()
{}
MyArray::MyArray(int leng)
{ if (leng<=0)
{ cout<<"error length";
exit(1);
}
alist=new int[leng];
length=leng;
if(alist==NULL)
{ cout<<"assign failure";
exit(1);
}
cout<<"MyArray类对象已创建。"<<endl;
}
MyArray::~MyArray()
{
cout<<"MyArray类对象被撤销。"<<endl;
}
void MyArray::Input()
{ cout<<"请从键盘输入"<<length<<"个整数:";
int i;
int *p=alist;
for(i=0;i<length;i++,p++) cin>>*p;
}
void MyArray::Display(string str)
{ int i;
int *p=alist;
cout<<str<<length<<"个整数:";
for(i=0;i<length;i++,p++) cout<<*p<<" ";
cout<<endl;
}
class ASArray:public MyArray
{
public:
ASArray(int length):MyArray(length)
{
cout<<"对象已创建:"<<endl;
}
virtual ~ASArray();
int aver();
int sort();
};
ASArray::~ASArray()
{
cout<<"AverArray对象被撤销:"<<endl;
}
int ASArray::sort()
{
int i,j;
int *p;
for(i=0;i<length;i++)
{
p=alist;
for(j=0;j<length-i-1;j++,p++)
{
if(*p>*(p+1))
swap(*p,*(p+1));
}
}
}
int ASArray::aver()
{
int i,j;
int *p;
double sum=0,ave;
p=alist;
for(i=0;i<length;i++,p++)
{
sum=sum+*p;
}
ave=sum/length;
cout<<"平均数:"<<ave<<endl;
}
int main()
{
ASArray a(5);
a.Input();
a.Display("显示已输入的");
a.sort();
a.Display("显示排序后的");
a.aver();
return 0;
}
(3)People类是教师类Teacher和干部类Cader的虚基类。
People类的数据成员:name(姓名)、age(年龄)、sex(性别)、add(地址) 、tel(电话)
Teacher类的数据成员:name(姓名)、age(年龄)、sex(性别)、add(地址) 、tel(电话)、title(职称)
Cader类的数据成员:name(姓名)、age(年龄)、sex(性别)、add(地址) 、tel(电话)、post(职务)
Teacher_Cader类是Teacher类和Cader类的派生类,并新增数据成员wages(工资)
int main()
{ Teacher_Cader ob1(“李明”,30,“男”, ”淮北师范大学”,3803333,“讲师”,“科长”,4500),ob2 ;
................................
/*People类是教师类Teacher和干部类Cader的虚基类。
People类的数据成员:name(姓名)、age(年龄)、sex(性别)、add(地址) 、tel(电话)
Teacher类的数据成员:name(姓名)、age(年龄)、sex(性别)、add(地址) 、tel(电话)、title(职称)
Cader类的数据成员:name(姓名)、age(年龄)、sex(性别)、add(地址) 、tel(电话)、post(职务)
Teacher_Cader类是Teacher类和Cader类的派生类,并新增数据成员wages(工资)
int main()
{ Teacher_Cader ob1(“李明”,30,“男”, ”淮北师范大学”,3803333,“讲师”,“科长”,4500),ob2 ;
*/
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
class Teacher
{
private:
string name;//姓名
int age;//年龄
string sex;//性别
string add;//地址
string tel;//电话
string title;//职称
public:
Teacher();
int input_teacher();
void output_teacher();
Teacher(string name,int age,string sex,string add,string tel,string title)
{
cout<<"Teacher对象构建成功"<<endl;
}
~Teacher();
};
int Teacher::input_teacher()
{
cout<<"职称:";
cin>>title;
return 0;
}
void Teacher::output_teacher()
{
cout<<"职称:"<<title<<endl;
}
Teacher::Teacher()
{
cout<<"Teacher对象构建成功"<<endl;
}
Teacher::~Teacher()
{
cout<<"Teacher对象撤销成功"<<endl;
}
class Cader
{
private:
string name;//干部姓名
int age;//年龄
string sex;//性别
string add;//地址
string tel;//电话
string post;//职务
public:
Cader(string name,int age,string sex,string add,string tel,string post)
{
cout<<"Cader对象构建成功"<<endl;
}
Cader();
~Cader();
int input_cader();
void output_cader();
};
int Cader::input_cader()
{
cout<<"职务:";
cin>>post;
return 0;
}
void Cader::output_cader()
{
cout<<"职务:"<<post<<endl;
}
Cader::Cader()
{
cout<<"Cader对象构建成功"<<endl;
}
Cader::~Cader()
{
cout<<"Cader对象撤销成功"<<endl;
}
class People:virtual public Teacher,virtual public Cader
{
private:
string name;//姓名
int age;//年龄
string sex;//性别
string add;//地址
string tel;//电话
public:
People();
~People();
People(string name,int age,string sex,string add,string tel,string title,string post):Teacher(name,age,sex,add,tel,title),Cader(name,age,sex,add,tel,post)
{
cout<<"People对象构建成功"<<endl;
}
int input_people();
void output_people();
};
int People::input_people()
{
cout<<"姓名:";
cin>>People::name;
cout<<"年龄:";
cin>>People::age;
cout<<"性别:";
cin>>People::sex;
cout<<"地址:";
cin>>People::add;
cout<<"电话:";
cin>>People::tel;
return 0;
}
void People::output_people()
{
cout<<"姓名:"<<People::name<<endl;
cout<<"年龄:"<<People::age<<endl;
cout<<"性别:"<<People::sex<<endl;
cout<<"地址:"<<People::add<<endl;
cout<<"电话:"<<People::tel<<endl;
}
People::People()
{
cout<<"People对象构建成功"<<endl;
}
People::~People()
{
cout<<"People对象撤销成功"<<endl;
}
class Teacher_Cader:public Teacher,public Cader
{
private:
int wages;//工资
public:
Teacher_Cader(string name,int age,string sex,string add,string tel,string title,string post):Teacher(name,age,sex,add,tel,title),Cader(name,age,sex,add,tel,post)
{
cout<<"Teacher_Cader对象构建成功"<<endl;
}
~Teacher_Cader();
Teacher_Cader();
int input_teacher_cader();
void output_teacher_cader();
};
void Teacher_Cader::output_teacher_cader()
{
Teacher::output_teacher();
Cader::output_cader();
}
int Teacher_Cader::input_teacher_cader()
{
Teacher::input_teacher();
Cader::input_cader();
return 0;
}
Teacher_Cader::Teacher_Cader()
{
cout<<"Teacher_Cader对象构建成功"<<endl;
}
Teacher_Cader::~Teacher_Cader()
{
cout<<"Teacher_Cader对象撤销成功"<<endl;
}
int main()
{
Teacher_Cader ob1("李明",30,"男","淮北师范大学","3803333","讲师","科长"),ob2;
People p1;
ob1.input_cader();
ob2.input_teacher();
ob1.output_cader();
ob2.output_teacher();
p1.input_people();
p1.output_people();
system("pause");
return 0;
}
推荐几款学习编程的网站
免费在线开发平台(https://docs.ltpp.vip/LTPP/)
探索编程世界的新天地,为学生和开发者精心打造的编程平台,现已盛大开启!这个平台汇集了近4000道精心设计的编程题目,覆盖了C、C++、JavaScript、TypeScript、Go、Rust、PHP、Java、Ruby、Python3以及C#等众多编程语言,为您的编程学习之旅提供了一个全面而丰富的实践环境。
在这里,您不仅可以查看自己的代码记录,还能轻松地在云端保存和运行代码,让编程变得更加便捷。平台还提供了私聊和群聊功能,让您可以与同行们无障碍交流,分享文件,共同进步。不仅如此,您还可以通过阅读文章、参与问答板块和在线商店,进一步拓展您的知识边界。
为了提升您的编程技能,平台还设有每日一题、精选题单以及激动人心的编程竞赛,这些都是备考编程考试的绝佳资源。更令人兴奋的是,您还可以自定义系统UI,选择视频或图片作为背景,打造一个完全个性化的编码环境,让您的编程之旅既有趣又充满挑战。
免费公益服务器(https://docs.ltpp.vip/LTPP-SHARE/linux.html)
作为开发者或学生,您是否为搭建和维护编程环境而困扰?现在,有一款免费的公共服务器,内置多种编程语言的编程环境,并且配备了在线版VS Code。让您可以随时随地在线写代码,无需复杂配置,专注于开发和学习。(PS:毕竟是免费公共的服务器,任何人都能够使用,为了数据隐私和安全,请勿上传重要数据,仅用于学习)
免费公益MYSQL(https://docs.ltpp.vip/LTPP-SHARE/mysql.html)
作为一名开发者或学生,您是否常常为数据库环境的搭建而烦恼?是否因为预算有限而无法使用高性能的数据库服务?现在,有一款免费的MySQL服务器,专为开发者和学生量身打造,让你轻松无忧地进行开发和学习!内置在线phpmyadmin管理面板,方便用户查看数据。(PS:毕竟是免费公共的MYSQL,任何人都能够使用,为了数据隐私和安全,请勿上传重要数据,仅用于学习)
免费在线WEB代码编辑器(https://docs.ltpp.vip/LTPP-WEB-IDE/)
无论你是开发者还是学生,编程环境的搭建和管理可能会占用你宝贵的时间和精力。现在,有一款强大的免费在线代码编辑器,支持多种编程语言,让您可以随时随地编写、调试和运行代码,提升编程效率,专注于创意和开发。
免费二维码生成器(https://docs.ltpp.vip/LTPP-QRCODE/)
无论是企业宣传、活动推广,还是个人信息分享,二维码都是一种快速、高效的信息传递方式。现在,有一款功能强大的二维码生成器,不仅易于使用,还具备多种便捷功能,帮助您更轻松地生成和管理二维码。