实验3 派生类与继承实验

8 篇文章 1 订阅

实验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/

        无论是企业宣传、活动推广,还是个人信息分享,二维码都是一种快速、高效的信息传递方式。现在,有一款功能强大的二维码生成器,不仅易于使用,还具备多种便捷功能,帮助您更轻松地生成和管理二维码。

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在C++中,继承是一种重要的面向对象编程概念,它允许我们定义一个新的,该继承现有的所有属性和方法。派生类继承的子,它可以使用继承的所有属性和方法,并且可以添加自己的属性和方法。 在实验中,我们学习了C++继承派生类的相关知识,包括: 1. 继承的访问控制:公有继承、私有继承和保护继承。 2. 多重继承:一个派生类可以同时继承多个基。 3. 虚函数和纯虚函数:虚函数是在基中定义的函数,可以在派生类中重写;纯虚函数是没有实现的虚函数,必须在派生类中实现。 4. 虚函数表和虚函数指针:虚函数表是用于存储虚函数地址的表,虚函数指针指向虚函数表。 通过实验,我们能够更深入地理解C++继承派生类的概念和应用,能够更加灵活地使用面向对象编程思想来设计和实现程序。 ### 回答2: 继承是面向对象编程中的重要概念之一,它允许我们在已有的基础上创建新的,新可以继承并拥有已有的属性和方法。通过继承,可以减少代码的重复性,并且使代码更加可维护和扩展。 在进行派生类实验的过程中,我深刻体会到了继承的重要性和灵活性。首先,通过定义一个基,我可以将一些通用的属性和方法抽象出来,避免在每个派生类中都重复定义。这为程序的整体结构设计提供了便捷。 其次,派生类可以在继承的基础上进行扩展,添加新的属性和方法。这种灵活性使得派生类在满足基本功能的同时,也能根据具体需求进行定制化开发。例如,在一个动物的基础上,我可以派生出猫、狗等具体的动物子,它们各自有着自己的特点和行为。 另外,继承还支持多层次的派生关系。我可以从一个派生类中再派生出新的派生类,这样可以形成的层次结构。这种层次化设计可以更好地组织代码,使得代码更加清晰可读。 通过这次实验,我进一步理解了继承性与派生类的概念,学会了如何设计和使用继承关系。同时,我也认识到了继承关系的合理运用能够提高代码的效率和可维护性。继承不仅是面向对象编程的基础,也是实现代码重用和扩展的重要工具之一。在今后的编程实践中,我将更加灵活地运用继承,提高代码的质量和可扩展性。 ### 回答3: 继承性是面向对象编程中的一个重要特性,指的是子能够继承的属性和方法。通过继承,子可以重用父的代码,并且可以在此基础上进行扩展和修改。 派生类是指通过继承而创建的新。在派生类中,可以通过重写父的方法,改变其行为,实现多态性。派生类还可以新增自己的成员变量和成员方法,以满足自身的特殊需求。 在实验中,我们通过创建父派生类的关系,研究了继承性和派生类的特性。 通过继承,我们可以将通用的属性和方法放在父中,让子共享这些代码。这样可以提高代码的重用性和可维护性。同时,当需要对父中的方法进行修改时,只需在子中进行重写,不会对其他子造成影响。 在派生类中,我们可以根据需要重写父的方法,改变其行为。这使得可以根据实际情况来实现多态性,同一个方法在不同的派生类中可能表现出不同的行为。 派生类还可以新增自己的成员变量和成员方法。通过这样的方式,可以为子添加独特的功能,以满足特定的需求。 继承性和派生类是面向对象编程中非常重要的概念。通过合理运用这两个特性,可以使代码更加模块化和可扩展,提高代码的复用性和可维护性。同时,派生类的特性也使得面向对象编程更加灵活,可以根据实际需求进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WA-自动机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值