实验三派生类与继承一、实验目的1、学习类的继承,能够定义和使用类的继承关系。
2、学习派生类的声明与定义方法。
3、掌握类的定义和对象的声明。
4、熟悉公有派生和私有派生的访问特性。
5、掌握派生类构造函数和析构函数的执行顺序。
6、掌握利用访问声明调整基类成员在派生类中的访问属性。
二、试验内容1、下面的程序可以输出ASCII字符与所对应的数字的对照表。
修改下列程序,使其可以输出字母a到z(或任意两个字符间)与所对应的数字的对照表。
class table{public:table(int p){i=p;}void ascii(void);protected:int i;};void table::ascii(void){int k=1;for (;i<127;i++){cout<<setw(4)<<i<<" "<<(char)i;if((k)%12==0)cout<<"\n";k++;}cout<<"\n";}class der_table:public table{public:der_table(int p,char *m):table(p)c=m;}void print(void);protected:char *c;};void der_table::print(void){cout<<c<<"\n";table::ascii();}int main(){der_table obl(32,"ASCII value---char");obl.print();return 0;}提示:修改后的主程序为:int main(){der_table ob('a','z',"ASCII value---char");ob.print();return 0;}修改后的程序:(蓝色字体为改动处)#include<iostream>using namespace std;#include<iomanip>class table{public:table(int p){i=p;}void ascii(void);protected:int i;};void table::ascii(void){int k=1;for (;i<=122;i++)cout<<setw(4)<<i<<" "<<(char)i;if((k)%13==0)cout<<"\n";k++;}cout<<"\n";}class der_table:public table{public:der_table(int p,char *m):table(p){c=m;}void print(void);protected:char *c;};void der_table::print(void){cout<<c<<"\n";table::ascii();}int main(){der_table obl(97,"ASCII value---char");obl.print();return 0;}实现结果:2、已有类Time和Date,要求设计一个派生类Birthtime,它继承类Time和Date,并且增加一个数据成员Childname用于表示小孩的名字,同事设计主程序显示一个小孩的出生时间和名字。
class Time{public:Time(int h,int m, int s){hours=h;minutes=m;seconds=s;}void display(){cout<<"出生时间:"<<hours<<"时"<<minutes<<"分"<<seconds<<"秒"<<endl;}protected:int hours,minutes,seconds;};class Date{public:Date(int m,int d,int y){month=m;day=d;year=y;}void display(){cout<<"出生年月:"<<year<<"年"<<month<<"月"<<day<<"日"<<endl;}protected:int month,day,year;};实现程序如下:#include<iostream>using namespace std;#include<string>class Time{public:Time(int h,int m, int s){hours=h;minutes=m;seconds=s;}void display(){cout<<"出生时间:"<<hours<<"时"<<minutes<<"分"<<seconds<<"秒"<<endl;}protected:int hours,minutes,seconds;};class Date{public:Date(int mo,int d,int y){month=mo;day=d;year=y;}void display(){cout<<"出生年月:"<<year<<"年"<<month<<"月"<<day<<"日"<<' ';}protected:int month,day,year;};class Birthtime:public Time,public Date{public:Birthtime(int h,int m, int s,int y,int mo,int d,string name):Time(h,m,s),Date(mo,d,y) {Childname=name;}void display(){cout<<"姓名: "<<Childname<<' ';}private:string Childname;};int main(){Birthtime peo(11,30,26,1993,12,26,"陈珊珊");peo.Birthtime::display();peo.Date::display();peo.Time::display();return 0;}实现结果:3、编写一个学生和教师的数据输入和显示程序。
学生数据有编号、姓名、性别、年龄、系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。
要求将编号、姓名、性别、年龄的输入和显示设计成一个类Person,并作为学生类Student 和教师类Teacher的基类。
#include<iostream>using namespace std;#include<string>class Person{public:Person(int nu,string na,string se,int ag){number=nu;name=na;sex=se;age=ag;}void display(){cout<<"编号:"<<number<<endl;cout<<"姓名:"<<name<<endl;cout<<"性别:"<<sex<<endl;cout<<"年龄:"<<age<<endl;}private:int number;string name;string sex;int age;};class Student:public Person{public:Student(int nu,string na,string se,int ag,string maj,float sco):Person(nu,na,se,ag) {major=maj;score=sco;}void display1(){Person::display();cout<<"系别:"<<major<<endl;cout<<"成绩:"<<score<<endl;}private:string major;float score;};class Teacher:public Person{public:Teacher(int nu,string na,string se,int ag,string sit,string dep):Person(nu,na,se,ag) {situation=sit;department=dep;}void display2(){Person::display();cout<<"职称:"<<situation<<endl;cout<<"部门:"<<department<<endl;}private:string situation;string department;};int main(){Student stu(122591,"陈珊珊","女",20,"计算机",100);stu.display1();Teacher tea(2012,"冰音","女",30,"教授","教务处");tea.display2();return 0;}4、给出下面的基类:class area{protected:double height;double width;public:area(double h,double w){height=h;width=w;}virtual double getarea()=0;};【要求】(1)建立基类area的俩个派生类rectangle与isosceles,让每一个派生类都包含一个函数getarea(),分别用来返回矩形与三角形的面积。