继承与派生(实验题)
C++语言程序设计实验答案_继承与派生教学提纲

C++语言程序设计实验答案_继承与派生实验07 继承与派生(4学时)(第7章继承与派生)一、实验目的二、实验任务7_1 声明一个基类Animal。
有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。
7_2 声明一个基类BaseClass。
有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
7_3 声明一个车(vehicle)基类。
具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。
从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?编程试试看。
7_4 以实验6中的People(人员)类为基类。
派生出student(学生)类,添加属性:班号char classNo[7];派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。
从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。
重载相应的成员函数,测试这些类。
类之间的关系如图7-1所示。
图7-1 类图三、实验步骤1.(编程)声明基类Animal,成员变量age声明为私有的。
构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:(注:在桌面创建一个文本文件,将输出框的内容复制到文本文件中,再复制到Word文件中,不会出现汉字的乱码)把age改为公有变量后重新编译就可以了。
继承和派生测试题

继承和派生练习选择题单选题1.下列虚基类的声明中,正确的是()。
A. class virtual B:public AB. virtual class B:public AC. class B:public A virtualD. class B: virtual public A2.C++类体系中,不能被派生类继承的有()。
A. 构造函数B. 虚函数C. 静态成员函数D. 赋值操作函数3.下列说法错误的是()。
A. 公有继承的基类中的public成员在派生类中仍是public的B. 公有继承的基类中的private成员在派生类中仍是private的C. 私有继承的基类中的public成员在派生类中变成private的D. 保护继承的基类中的public成员在派生类中变成protected的4.下列对继承的描述中,错误的是()。
A. 析构函数不能被继承B. 派生类也是基类的组合C. 派生类的成员除了它自己的成员外,还包含了它的基类的成员D. 派生类中继承的基类成员的访问权限到派生类保持不变5.下列对基类和派生类关系的描述中,错误的是()。
A. 派生类是基类的具体化B. 派生类是基类的子集C. 派生类是基类定义的延续D. 派生类是基类的组合6.C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。
A. 复用B. 继承C. 封装D. 引用7.C++类体系中,能被派生类继承的是()。
A. 构造函数B. 虚函数C. 析构函数D. 友元函数8.关于多继承二义性的描述,()是错误的。
A. 派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B. 一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C. 解决二义性最常用的方法是作用域运算符对成员进行限定D. 派生类和它的基类中出现同名函数时,将可能出现二义性9.下列对派生类的描述中,()是错误的。
C语言程序设计实验答案继承与派生

C语⾔程序设计实验答案继承与派⽣实验07 继承与派⽣(4学时)(第7章继承与派⽣)⼀、实验⽬的⼆、实验任务7_1 声明⼀个基类Animal。
有私有整型成员变量age,构造其派⽣类dog,在其成员函数SetAge(int n)中直接给age 赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。
7_2 声明⼀个基类BaseClass。
有整型成员变量Number,构造其派⽣类DerivedClass,观察构造函数和析构函数的执⾏情况。
7_3 声明⼀个车(vehicle)基类。
具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派⽣出⾃⾏车(bicycle)类、汽车(motorcar)类。
⾃⾏车(bicycle)类有⾼度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。
从bicycle和motorcar派⽣出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?编程试试看。
7_4 以实验6中的People(⼈员)类为基类。
派⽣出student(学⽣)类,添加属性:班号char classNo[7];派⽣出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。
从student类中派⽣出graduate(研究⽣)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate类和teacher类派⽣出TA(助教⽣)类,注意虚基类的使⽤。
重载相应的成员函数,测试这些类。
类之间的关系如图7-1所⽰。
图7-1 类图三、实验步骤1.(编程)声明基类Animal,成员变量age声明为私有的。
构造派⽣类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提⽰:(注:在桌⾯创建⼀个⽂本⽂件,将输出框的内容复制到⽂本⽂件中,再复制到把age改为公有变量后重新编译就可以了。
实验四:派生类和继承(一)

福建农林大学实验报告实验4 派生类和继承(一)一、实验目的和要求(1)掌握派生类的声明与定义方法,进一步理解类的继承的概念,能够定义和使用类的继承关系。
(2)熟悉公有派生和私有派生的访问特性。
二、实验内容和原理1、(1)定义一个基类Animal,该类具有私有整型成员变量age,weight,构造派生类Dog公有继承Animal。
Dog类新增私有成员变量color,新增成员函数SetAge(int n)中直接给age赋值,新增成员函数SetWeight(int m)中直接给weight赋值,查看编译结果,并分析结果。
(2)将类Anima l中的age和weight为公有成员,重做第一步,并分析结果。
(3)将类Animal中的age和weight 为保护成员,重做第一步,并分析结果。
(4)将派生类Dog的继承方式改为私有继承方式和保护继承方式重做以上各小题,并分析结果。
2、程序分析题(写出程序的输出结果,并分析结果)。
三、实验环境1. 硬件:PC机;2. 软件:Windows操作系统、Visual C++ 6.0四、算法描述及实验步骤1、(1):#include <iostream.h>class animal{private:int age,weight;};class dog:public animal{private:char color[10];public:int SetAge(int n){age=n;return n;}int SetWeight (int m){weight=m;return m; }};int main(){ int x,y;dog a;cout<<"Please input dog's age :";cin>>x;cout<<endl;cout<<" Please input dog's weight:";cin>>y;cout<<endl;cout<<"The dog's age is "<<a.SetAge(x)<<endl;cout<<"The dog's age weight is"<<a.SetWeight(y)<<endl; return 0;}(2):#include <iostream.h>class animal{public:int age,weight;};class dog:public animal{private:char color[10];public:int SetAge(int n){age=n;return n;}int SetWeight (int m){weight=m;return m; }};int main(){ int x,y;dog a;cout<<" Please input dog's age :";cin>>x;cout<<endl;cout<<" Please input dog's weight:";return 0;}(3):#include <iostream.h>class animal{private:int age,weight;};class dog:public animal{private:char color[10];public:int SetAge(int n){age=n;return n;}int SetWeight (int m){weight=m;return m; }};int main(){ int x,y;dog a;cout<<" Please input dog's age :";cin>>x;cout<<endl;cout<<" Please input dog's weight:";cin>>y;cout<<endl;cout<<" The dog's age is "<<a.SetAge(x)<<endl;cout<<" The dog's age weight is "<<a.SetWeight(y)<<endl; return 0;}(4):#include <iostream.h>class animal{private:int age,weight;};class dog:public animal{private:char color[10];public:int SetAge(int n){age=n;return n;}int SetWeight (int m){weight=m;return m; }};int main(){ int x,y;dog a;cout<<" Please input dog's age :";cin>>x;cout<<endl;cout<<" Please input dog's weight:";return 0;}(5):#include <iostream.h>class animal{private:int age,weight;};class dog:public animal{private:char color[10];public:int SetAge(int n){age=n;return n;}int SetWeight (int m){weight=m;return m; }};int main(){ int x,y;dog a;cout<<" Please input dog's age :";cin>>x;cout<<endl;cout<<" Please input dog's weight:";cin>>y;cout<<endl;cout<<" T The dog's age is "<<a.SetAge(x)<<endl;cout<<" The dog's age weight is "<<a.SetWeight(y)<<endl; return 0;}(6):#include <iostream.h>class animal{private:int age,weight;};class dog:public animal{private:char color[10];public:int SetAge(int n){age=n;return n;}int SetWeight (int m){weight=m;return m; }};int main(){ int x,y;dog a;cout<<" Please input dog's age :";cin>>x;cout<<endl;cout<<" Please input dog's weight:";return 0;}(7):#include <iostream.h>class animal{private:int age,weight;};class dog:public animal{private:char color[10];public:int SetAge(int n){age=n;return n;}int SetWeight (int m){weight=m;return m; }};int main(){ int x,y;dog a;cout<<" Please input dog's age :";cin>>x;cout<<endl;cout<<" Please input dog's weight:";cin>>y;cout<<endl;cout<<" The dog's age is "<<a.SetAge(x)<<endl;cout<<" The dog's age weight is "<<a.SetWeight(y)<<endl; return 0;}(8):#include <iostream.h>class animal{private:int age,weight;};class dog:public animal{private:char color[10];public:int SetAge(int n){age=n;return n;}int SetWeight (int m){weight=m;return m; }};int main(){ int x,y;dog a;cout<<" Please input dog's age :";cin>>x;cout<<endl;cout<<" Please input dog's weight:";return 0;}(9):#include <iostream.h>class animal{private:int age,weight;};class dog:public animal{private:char color[10];public:int SetAge(int n){age=n;return n;}int SetWeight (int m){weight=m;return m; }};int main(){ int x,y;dog a;cout<<" Please input dog's age :";cin>>x;cout<<endl;cout<<" Please input dog's weight:";cin>>y;cout<<endl;cout<<" The dog's age is "<<a.SetAge(x)<<endl;cout<<" The dog's age weight is "<<a.SetWeight(y)<<endl; return 0;}2#include<iostream.h>class A{public: A(int i,int j){a=i;b=j;}void move(int x,int y){a+=x;b+=y;}void display(){cout<<"("<<a<<","<<b<<")"<<endl;} private:int a,b;};class B:public A{public: B(int i,int j,int k,int l):A(i,j),x(k),y(l){}void display(){cout<<x<<","<<y<<endl;}void fun1(){move(13,15);}void fun2(){A::display();}void fun3(){display();}private:int x,y;int main(){A aa(2,4);aa.display();B bb(5,6,7,8);bb.fun1();bb.fun2();bb.fun3();bb.A::display();bb.B::display();return 0;}五、调试过程1、调试程序,截图如下:原因分析:在public继承中void display 中的display打错成diaplay。
实验5继承实验参考答案

实验5 继承与派生参考答案2 ) 分析下面的程序,指出程序运行的结果:#include<iostream.h>class CBase1{int x ;public:CBase1( ){x=0 ; cout<<"调用构造函数CBase1( )!\n";}CBase1( int a){x=1;cout<<"调用构造函数CBase1( int )!\n";}~CBase1( ){cout<<"调用析构函数~CBase1( )!\n";}};class CBase2{int y;public:CBase2( ){y=0 ;cout<<"调用构造函数CBase2( )!\n";}CBase2(int a){y=a ;cout<<"调用构造函数CBase2(int )!\n";}~CBase2(){cout<<"调用析造函数~CBase2( )!\n";}};class A{ int x;public:A() {x=0 ; cout<<"调用构造函数A( )!\n";}A(int a){x=a;cout<<"调用构造函数A(int )!\n";}~A(){cout<<"调用析构函数~A()!\n";}};class CDerived:public CBase1, virtual public CBase2{A a;public:CDerived(){cout<<"调用构造函数CDerived( )!\n";}CDerived(int x,int y ,int z):a(x),CBase1(y),CBase2(z){cout<<"调用构造函数CDerived(int,int )!\n";}~CDerived(){cout<<"调用析造函数~CDerived( )!\n";}};void main(){CDerived*x=new CDerived; CDerived y(2,3,4);delete x;cout<<"main()函数结束!\n"; }程序分析:a)类分析:本程序有三个类,其中类CDerived公有继承类CBase1和虚基类CBase2,类CDerived使用类A。
实验四 继承与派生(学生)

实验四:继承与派生(2)一、实验目的和要求(1)理解单继承与多继承,掌握多继承派生类的声明方式。
(2)掌握多继承派生类构造函数的定义的一般形式。
(3)掌握多继承构造函数与析构函数的执行顺序。
(4)掌握含有对象成员的派生类构构造函数的特点。
(5)理解类的继承可能发生的“二义性”问题(同名成员的访问)二、知识点回顾多继承构造函数定义的一般形式如下:派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),…,基类名n(参数表n) {// 派生类新增成员的初始化语句}class B: public A class D:public A, public B, public C{ {B(int i,int j):A( i){ ….. D(int i,int j,int k, int l):A( i),B(j ),C( k),ob(l ) } { …….}}; };…….D obj(1,2,3,4);多重继承构造函数的执行顺序与单继承下的构造函数执行顺序相同:(1)先执行基类的构造函数。
(2)再执行对象成员的构造函数。
(3)最后执行派生类的构造函数体。
说明:处于同一层的各个基类的构造函数的执行顺序, 取决于声明派生类时所指定的各个基类的顺序, 与派生类构造函数中所定义的成员初始化列表中的顺序并没有关系.说明:派生类构造函数后如未列出基类构造函数的调用,默认调用的是无参或带默认参数的构造函数。
三、实验内容1. P191题4.15输入下列程序,分析程序运行结果........。
理解多重继承(画出类的层次结构图),注意派生类构造函数的定义格式,注意构造函数的执行顺序,注意同名成员的访问。
#include<iostream>#include<string>using namespace std;class B1{int b1;public:B1(int i){b1=i;cout<<"Construcor B1."<<i<<endl;}void print(){ cout<<b1<<endl;}};class B2{int b2;public:B2(int i){b2=i;cout<<"Construcor B2."<<i<<endl;}void print(){ cout<<b2<<endl;}};class B3{int b3;public:B3(int i){b3=i;cout<<"Construcor B1."<<i<<endl;}int getb3(){ return b3;}};class A:public B2,public B1{int a;B3 bb;public:A(int i,int j,int k,int l):B1(i),B2(j),bb(k) //此处注意派生类构造函数的定义格式{a=l;cout<<"Constructor A."<<l<<endl;}void print() //{ B1::print(); //同名成员的访问,注意消除二义性B2::print(); //同名成员的访问cout<<a<<","<<bb.getb3()<<endl;}};int main(){ A aa(1,2,3,4);aa.print(); //分析调用的是哪个print(). 同名覆盖(将基类的同名成员隐藏)return 0;}在以上程序的基础上,为每个类增加一个析构函数,析构函数体内容“Destructor X”,其中X写成具体的类名。
实验四 继承与派生

实验四继承与派生一. 实验目的:1.了解继承与派生的概念,掌握派生类声明的方式和派生类的构成。
2. 掌握派生类成员的访问属性。
3. 掌握派生类构造函数的定义方法。
4. 掌握多重继承的方法。
5. 掌握虚基类的使用。
6. 掌握基类与派生类的转换关系。
二. 实验类型:验证型实验和设计型实验三. 验证型实验内容:1.编写运行下面程序,体会继承与派生的概念,学习派生类声明的方式并了解派生类的构成。
#include <iostream>#include <string>using namespace std;class Person //声明基类{public:void set_person(char[],int,char);void display_person( );private :char name[20];int age;char sex;};void Person::set_person(char na[],int a,char s){strcpy(name,na);age=a;sex=s;}void Person::display_person( ){ cout<<"name:"<<name<<endl;cout<<"age:"<<age<<endl;cout<<"sex:"<<sex<<endl;}class Student: public Person //声明派生类{ public:void set_student(char[],int,char,int,char[],int); //派生类新增加成员函数void display_student( ); //派生类新增加成员函数private:int num; //派生类新增加数据成员char speciality[20]; //派生类新增加数据成员int grade; //派生类新增加数据成员};void Student::set_student(char na[],int a,char s,int n,char sp[],int g)//设置派生类中全部数据成员{set_person(na,a,s); //调用派生类继承的基类成员函数num=n;strcpy(speciality,sp);grade=g;}void Student::display_student( ) //显示派生类中全部数据成员{ display_person( ); //调用派生类继承的基类成员函数cout<<"num:"<<num<<endl;cout<<"speciality:"<<speciality<<endl;cout<<"grade:"<<grade<<endl;}int main( ){Student s; //定义派生类对象s.set_student("wang",21,'m',20060701,"JAVA",2);s.display_student();return 0;}提示:在开发环境中,通过在派生类对象后面输入成员访问运算符可以看到派生类中的成员列表,了解派生类的构成。
实验八 派生与继承参考答案

}
结果截图:
11.3
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
protected:
int num;
string name;
char sex;
};
class Student1:protected Student{
stud1.get_value1();
stud1.display1();
return 0;
}
结果截图:
8.3
#include<string>
using namespace std;
class Student
{
public:
void get_value()
{
cin>>num>>name>>sex;
}
void display()
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
实验八
8.1
1.理解继承的含义以及声明;
2.理解共有派生、私有派生和保护派生的含义以及使用;
8.2
8.2.1
1.完成例题11.1—11.3,使其输出正确结果。
11.1
#include<iostream>
#include<string>
using namespace std;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五继承与派生
一、实验目的
(1)了解继承在面向对象程序设计中的重要作用。
(2)进一步理解继承与派生的概念。
(3)掌握通过继承派生出一个新的类的方法。
二、实验内容
设计:
某小型公司的人员:技术人员Technician,推销员saleman;
1、类x
1)Employee类:
基本信息:编号、姓名、性别、出生日期、职位,薪水等;
其中出生日期使用自定义的Date(日期)类;
基本信息为private属性,成员函数为public属性;多个构造函数(缺省构造、带参数的构造);可以从外部访问类成员的友元函数;
2)Date类:
成员变量:年、月、日
成员函数:SetYear(int year)、SetMonth(int month)、SetDay(int day)、GerYear()、GetMonth()、GetDay()
3)派生类Technician:新增属性:工作时间
4)派生类saleman:新增属性:销售额、所属部门
2、基本功能
1)人员信息的录入;
2)人员信息的显示;
3)计算并显示个人月薪:
月薪计算方法:技术人员按每小时30元领取月薪;推销员的月薪按当月销售额的4% 提成;
4)计算当月公司的总销售额并输出;
5)用对象数组保存职工对象;
6)可以修改人员的基本信息,如:姓名、职位等;
实验提示
1、在基类中,除了定义构造函数和析构函数,还应统一定义对各类人员信息应有的操作,规范类族中各派生类的基本行为。
但是各类
人员的月薪计算犯法不同,不能在基类employee中统一确定计算方法。
各类人员信息的显示内容不同,同样不能在基类employee 中统一确定显示方法。
因此在基类中实现上述功能(计算和显示)的函数体应为空,在派生类中根据同名覆盖原则定义各自的同名函数实现具体功能。
2、将基类employee分两个独立文档:employee.h(类声明头文件)和employee.cpp(类实现文件)
报告的书写注意事项:
报告包括实验目的,实验内容,实验设计(指出主要函数或者类,必要时附流程图),核心代码,运行结果,心得体会。