继承与派生(实验题)
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;
C++实验三继承和派生类(附答案)
实验三继承和派生类实验目的和要求1.理解类的继承的概念,能够定义和使用类的继承关系。
2.掌握派生类的声明与定义方法。
3.熟悉公有派生和私有派生的访问特性。
4.学习虚基类在解决二义性问题中的作用。
实验内容1.先阅读下面的程序,分析程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include<iostream.h>class A{public:A(){cout<<"A::A() called.\n";}~A(){cout<<"A::~A() called.\n";}};class B:public A{public:B(int i){cout<<"B::B() called.\n";buf=new char[i];}~B(){delete []buf;cout<<"B:~B() called.\n";}private:char *buf;};void main(){B b(10);}(2)#include<iostream.h>class A{public:A(int a,int b):x(a),y(b){cout<<"A constructor..."<<endl;}void Add(int a,int b){x+=a;y+=b;}void display(){cout<<"("<<x<<","<<y<<")"<<endl;}~A(){cout<<"destructor A..."<<endl;}private:int x,y;};class B:private A{private:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d),Aobj(1,1) {cout<<"B constructor..."<<endl;}void Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2;j+=y2;}void display()A::display();Aobj.display();cout<<"("<<i<<","<<j<<")"<<endl;}~B(){cout<<"destructor B..."<<endl;}};void main(){B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display();}(3)#include<iostream.h>class A{public:A(int a):x(a){cout<<"A constructor..."<<x<<endl;}int f(){return ++x;}~A(){cout<<"destructor A..."<<endl;}private:int x;};class B:public virtual A{private:int y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c)cout<<"B constructor..."<<y<<endl;}int f(){A::f();Aobj.f();return ++y;}void display(){cout<<A::f()<<'\t'<<Aobj.f()<<'\t'<<f()<<endl;}~B(){cout<<"destructor B..."<<endl;}};class C:public B{public:C(int a,int b,int c):B(a,b,c),A(0){cout<<"C constructor..."<<endl;}};class D:public C,virtual public A{public:D(int a,int b,int c):C(a,b,c),A(c){cout<<"D constructor..."<<endl;}~D(){cout<<"destructor D..."<<endl;}};void main(){D d(7,8,9);d.f();d.display();}#include<iostream.h>class Base1{public:Base1(){cout<<"class Base1!"<<endl;}};class Base2{public:Base2(){cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1 {public:Level1(){cout<<"class Level1!"<<endl;}};class Level2:public Base2,virtual public Base1 {public:Level2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2 {public:TopLevel(){cout<<"class TopLevel!"<<endl;}};void main(){TopLevel obj;}2.调试下列程序,并对程序进行修改后再调试,指出调试中的出错原因。
大连理工大学开发区c++实验五继承与派生答案
大连理工大学开发区c++实验五继承与派生答案
1下面对派生类的描述中,错误的是(D)。
A.一个派生类可以作为另外一个派生类的基类。
B.派生类至少有一个基类。
C.派生类的成员除了它自己的成员外,还包含了它的基类的成员。
D.派生类中继承的基类成员的访问权限到派生类中保持不变。
2下列对友元关系叙述正确的是(A)。
A.不能继承。
B.是类与类的关系。
C.是一个类的成员函数与另一个类的关系。
D.提高程序的运行效率。
3当保护继承时,基类的(B)在派生类中成为保护成员,不能通过派生类的对象来直接访问。
A.任何成员。
B.公有成员和保护成员。
C.公有成员和私有成员。
D.私有成员。
4设置虚基类的目的是(B)。
A.简化程序。
B.消除二义性。
C.提高运行效率。
D.减少目标代码。
5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是(C)。
A.派生类的对象可以赋给基类的对象。
B.派生类的对象可以初始化基类的引用。
C.派生类的对象可以直接访问基类中的成员。
D.派生类的对象的地址可以赋给指向基类的指针。
【习题】继承与派生
【习题】继承与派生继承与派生【实验目的】: 1. 掌握派生类的使用方法。
2. 掌握派生类的构造函数和析构函数。
【实验内容】: 1. 定义一个哺乳动物Mammal类,再此派生出狗Dog类,定义一个Dog类的对象,观察基类与派生类的构造函数与析构函数的调用顺序。
2. 编写一个求出租车收费的程序,输入起始站、终止站和路程,计费公式是起价8元,其中含3公里费用,以后每半公里收费元。
3. 设计一个基类Base,包括编号、姓名、住址以及相关的成员函数,它派生出学生类Student和教师类Teacher,并用一些数据进行测试。
4. 定义一个rectangle类,它包含两个数据成员length 和width;以及包含用于求长方形面积的成员函数。
再定义rectangle的派生类cuboid,它包含一个新数据成员height和用来求长方体体积的成员函数。
在主函数中,使用2个类,求某个长方形的面积和某个长方体的体积。
5. 声明一个Object类,有数据成员weight和相应的操作函数,此派生出的Box类,增加数据成员height和weight及相应的操作函数,声明一个Box 对象,观察构造函数和析构函数的调用顺序。
6. 圆和三角形都需要输入三个数据,设计一个类Object管理这三个数据,从此类派生出圆类Circle 和三角形类Triangle,并求各自的面积。
7. 设计一个建筑物基类Buinding,它派生出宿舍类Hostel和教学楼Classroom,前者包括楼名、总层数、住户数、总住人数和总面积,后者包括楼名、总层数、教室数、灭火器数和总面积。
8. 派生类构造函数执行的次序是怎样的?先构造父类,再构造派生类,析构时先析构派生类,再析构父类。
9. 比较类的三种继承方式public公有继承、protected保护继承、private私有继承之间的差别。
公有继承:派生类函数可调用父类公有成员,父类在派生类中公有私有保护性质不变。
实验5派生与继承
实验5 派生与继承一、实验目的理解继承思想,掌握继承的语法。
⏹体会不同继承方式下派生类对基类成员的访问权限⏹掌握派生类中构造函数和析构函数的定义形式,理解其与基类构造函数和析构函数的关系与调用;⏹掌握派生类与基类同名函数的调用方法⏹理解继承体系中的赋值兼容性原则⏹掌握多继承的语法形式,理解虚继承关系。
二、实验内容1.设计一个学生和教师类,学生数据有编号、姓名、班级和成绩;教师数据有编号、姓名、职称和部门;要求:运用继承的思想实现相关功能:对学生和教师的数据进行输入和显示,类中包括各种构造函数,思考如何在派生类的构造函数中初始化基类的成员。
2.设计球类,用组合及继承包含点,在各个类中添加构造函数和show方法,并能计算球的表面积和体积。
1)按组合关系构造一个球类Ball,包含一个空间中的点(x,y,z)。
2)按继承构造一个球类Sphere,构成三级单继承关系。
3) 按组合和继承关系构造一个非均匀的球体类,其中包括一个几何中心和物理重心3.编写一个程序,实现字符串的相关操作。
要求:在已有简单串类myString的基础上派生字符串类String1,类中包含返回字符串长度功能,并能使用运算符实现字符串连接与比较(不用库函数);设计一个具有编辑功能的串类String2,它从String1类派生而来。
成员函数能够在在字符串指定位置处实现如下操作:插入字符串、替换和删除某个字符,并能查找子串。
设计UML图见下4.综合性的实验,设计数组类族。
要求编写的程序涉及到C++的许多知识点,如类的定义,动态分配内存,构造函数,派生,虚基类等。
实验内容给出的是一个完整的程序,4个题目实际是类等级。
同学也可以在此基础上发挥增加新的内容。
1)定义一个基类MyArray,基类中可以存放一组数组。
编写构造函数,析构函数及其它函数,实现动态分配内存,释放内存和数据输入输出等功能。
并进行调试。
2)定义一个类averarray继承自myarray,在类中求数组的平均值,并输出。
实验七 继承与派生
实验七继承与派生【实验目的】1、掌握继承的概念。
2、理解派生类与基类的关系。
3、理解不同的继承类型。
4、掌握继承下的构造函数和析构函数。
5、掌握单继承和多继承使用方法。
6、理解静态成员。
【实验内容】1、上机分析下面程序,理解继承下构造函数和析构函数的执行顺序。
#include <iostream.h>class A{public:A(){cout<<"Constructor1_A"<< x << endl;}A( int m ) : x( m ){cout<<"Constructor2_A"<< x << endl;}~A(){cout<<"Destructor_A"<< x << endl;}private:int x;};class B : public A{public:B(){cout<<"Constructor1_B"<< y << endl;}B( int m, int n, int l ) : A( m ), a( n ), y( l ){cout<<"Constructor2_B"<< y <<endl;}~B(){cout<<"Destructor_B"<< y << endl;}private:A a;int y;};int main(){B b1, b2(5,6);return 0;}2、在下面一段类定义中,Derived类是有直接基类Base1和Base2所派生的,Derived 类包含有两个间接基类Base,在初始化函数Init中,需要把x1和x2的值分别赋给属于基类Base1的x成员和属于基类Base2的x成员。
实验5 继承与派生
[实验目的]1、了解继承在面向对象程序设计中的重要作用;2、进一步理解继承与派生的概念;3、学会通过继承派生出一个新类的方法;[实验要求]给出以下各实验内容的源程序代码,并把编译、运行过程中出现的问题以及解决方法填入实验报告中,按时上交。
[实验学时] 2学时。
[实验内容]1、声明一个人员类(Person),包括3个数据成员:name(姓名)、age(年龄)、sex(性别);2个成员函数:构造函数和输出相关信息的函数display()。
利用单继承的方式声明一个学生(Student)派生类,其中增加2个数据成员:grade(年级)、score(总学分);3个成员函数:构造函数、输出函数show()和增加学分的函数add()。
在定义派生类对象时给出初始化的数据,然后输出这些数据。
[源程序]#include<iostream>#include<string>using namespace std;class Person{public:Person(string na,int ag,string se){name=na;age=ag;sex=se;}void display(){cout<<"name:"<<name<<endl;cout<<"age:"<<age<<endl;cout<<"sex:"<<sex<<endl;}private:string name;int age;string sex;};class Student : public Person{public:Student(string na,int ag,string se,string gr,float sc):Person(na,ag,se){grade=gr;score=sc;}void show(){display();cout<<"grade:"<<grade<<endl;cout<<"score:"<<score<<endl;}void add();private:string grade;float score;};int main(){Student stu1("小明",19,"男","广告11A-2",93);stu1.show();return 0;}2、分别定义教师(Teacher)类和干部(Cadre)类,采用多重继承方式由这两个类派生出新类:教师兼干部(Teacher_Cadre)。
实验三 继承和类的派生
实验三类的派生与继承实验目的和要求1 掌握继承和派生类的概念。
2 掌握派生类对基类的继承。
3 了解多继承。
实验内容1. 编写一个程序,其中有一个书类book,其数据包括书号、书名、定价、出版社及出版时间:有一个作者类author,其数据成员包括姓名、年龄和写作时间,每个类都有相应的输入输出。
以此两个为基类派生出图书查询卡card,并增加一个数据成员表示书籍系统名称,以及一个可以显示系统名称、书名、作者、作者年龄、出版时间、出版社和定价等数据的函数。
2. 设计一个大学的类系统,学校中有学生、教师,每种人员都有自己的特性,他们之间有相同的地方(以 person 类为基类,有姓名、编号),又有各自不同的特性(学生:专业、平均成绩;教师:职称、工资)。
利用继承机制定义这个系统中的各个类,要求输入姓名等信息后再将这些信息输出。
实验原理:1、继承与派生的概念及目的;2、派生类大的声明方式、构成以及访问属性;3、多继承的声明方法;4、含有子对象的派生类的声明方式以及执行顺序;实验内容一:编程思想:编程过程中考虑到过程较为复杂,我采用了分步、分块编程的方法,使得程序的功能逐步地实现。
程序的基本框架如下:第一步:因为考虑到book和author中都需要输入和时间有关的变量,所以将时间作为它们共同的基类,向它们传递时间变量的属性。
Time类是一个比较基本的类的建立,在第一章中已经可以较为熟练地掌握。
第二步:实现书籍基本信息的输入和输出。
此步中用到了继承,因为此类中需要建立出版时间,所以建立了一个Time类的对象:bpubt。
在Book类中设计数据的输入输出函数,并在输入输出函数中通过对象bpubt调用时间类的输入输出函数。
编程过程中,Book类的功能通过以下代码实现,并检查运行结果无误。
#include<iostream>#include<stdlib.h>#include<string>using namespace std;class Time{private:int day;int month;int year;public:Time(int d=0,int m=0,int y=0){ day=d;month=m;year=y;}void setin(){cout<<"请输入时间:"<<endl; cin>>day>>month>>year;}void setout(){cout<<day<<"/"<<month<<"/"<<year<<en dl;}};class book:public Time{private:float bp;int bnum;string bname;string bpubl;Time bpubt;public:void setin() {cout<<"请输入书的简单情况:"<<endl;cin>>bnum>>bname>>bp>>bpubl; bpubt.setin();}void setout(){cout<<bnum<<endl;cout<<bname<<endl;cout<<bp<<endl;cout<<bpubl<<endl;bpubt.setout();}};int main(){book book1;book1.setin();book1.setout();system("PAUSE");return 0;}运行结果:在编写过程中遇到字符串的输入问题,通过调用头文件#include<string.h>得以解决。
实验九 派生与继承—构造与析构参考答案
实验九派生与继承——构造与析构函数9.1 实验目的1.理解派生类中构造函数和析构函数及其调用顺序。
2、理解虚基类的应用。
9.2 实验内容9.2.1程序阅读1.理解下面的程序,并运行查看结果,回答程序后面的问题。
#include <iostream>using namespace std;class CBase{public:CBase(int a):a(a){}void print(){cout<<"a="<<a<<endl;}private:int a;};class CDerive : public CBase{public:CDerive(int a,int s):CBase(a){b=s;}void print(){cout<<"b="<<b<<endl;}int b;};int main(){CDerive d(3,4);d.print();//-----------------------------------------------------①CBase b(4);b.print();//-----------------------------------------------------②return 0;}问题一:请指出①与②两处的print函数调用有何区别?答:①处是调用派生类CDerive的成员函数,在派生类中函数print()与基类中的print()同名,所以它会覆盖基类重中的print()函数,在调用函数时执行派生类的print()函数;而②处是调用CBase类的成员函数。
问题二:修改程序,使程序能输出基类的数据成员a。
答:1、在①处后面增加代码d.CBase::print();2、在派生类的print函数中增加语句CBase::print();2.理解下面的程序,并运行查看结果,回答程序后面的问题。
实验四 继承与派生2
实验四继承与派生(二)班级:软件1302班学号:201313138064 姓名:代永强[实验目的]:1.理解多重继承的概念;2.理解为了避免同一基类出现多个重复的副本而采用的虚基类概念和虚拟继承;3.学习利用虚基类解决二义性问题。
[实验内容]:实验题目:设计一个用于人事管理的“people(人员)”基类。
考虑到通用性,仅抽象出所有类型人员都具有的属性:编号、姓名、性别、出生日期、身份证号等;从people(人员)类派生出student(学生)类,并添加属性:班号ClassNo;从people类派生出teacher(教师)类,并添加属性:专业subject、导师teacher adviser(teacher类);从graduate 类和teacher类派生出TA(助教生)类。
设计时注意虚基类的使用,注意重载相应的成员函数。
测试这些类。
程序源代码:#include<iostream>#include<string>using namespace std;class Date{private:int Year;int Month;int Day;public:Date();Date(int Y,int M,int D);void SetDate(int y,int m,int d);int GetYear(){return Year;}int GetMonth(){return Month;}int GetDay(){return Day;}virtual ~Date();};Date::Date(){Year=0;Month=0;Day=0;}Date::Date(int Y,int M,int D){Year=Y;Month=M;Day=D;}void Date::SetDate(int y,int m,int d){Year=y;Month=m;Day=d;}Date::~Date(){}class people{private:string Num;string Name;string Sex;Date birthday;string Id;public:people();people(string num,string name,string sex,int y,int m,int d,string id);people(people &p);string GetName();void Show();virtual ~people();};people::people(){}people::people(string num,string name,string sex,int y,int m,int d,string id):birthday(){birthday.SetDate(y,m,d);Num=num;Name=name;Sex=sex;Id=id;}people::~people(){}people::people(people &p):birthday(p.birthday){Num=p.Num;Name=;Sex=p.Sex;Id=p.Id;}void people::Show(){cout<<"编号:"<<Num<<endl;cout<<"姓名:"<<Name<<endl;cout<<"性别:"<<Sex<<endl;cout<<"出生日期:"<<birthday.GetYear()<<"-"<<birthday.GetMonth()<<"-"<<birthday.GetDay()<<endl;cout<<"身份证号:"<<Id<<endl;}string people::GetName(){return Name;}class student:virtual public people{private:int ClassNo;public:student(people p,int c);student(student &s);void Show();virtual ~student();};student::student(people p,int c):people(p){ClassNo=c;}student::student(student &s):people(s){ClassNo=s.ClassNo;}student::~student(){}void student::Show(){people::Show();cout<<"班号:"<<ClassNo<<endl;}class teacher:virtual public people{private:string Principalship;string Department;public:teacher(people p,string pr,string de);teacher();teacher(teacher &t);void Show();virtual ~teacher();string GetPrincipalship();string GetDepartment();};teacher::teacher(people p,string pr,string de):people(p){Principalship=pr;Department=de;}teacher::teacher():people(){Principalship=" ";Department=" ";}teacher::teacher(teacher &t):people(t){Principalship=t.Principalship;Department=t.Department;}string teacher::GetPrincipalship(){return Principalship;}string teacher::GetDepartment(){return Department;}void teacher::Show(){people::Show() ;cout<<"职务:"<<Principalship<<endl;cout<<"部门:"<<Department<<endl;}teacher::~teacher() {}class graduate:public student{protected:string Subject;teacher adviser;public:graduate(teacher t,people p1,int c,string su);void Show();virtual ~graduate();};graduate::graduate( teacher t,people p1,int c,stringsu ):people(p1),adviser(t),student(p1,c){Subject=su;}void graduate::Show(){student::Show();cout<<"专业:"<<Subject<<endl;cout<<"导师:"<<adviser.GetName()<<endl;;}graduate::~graduate(){}class TA:virtual public graduate,virtual public teacher{public:TA( teacher t1,people p,string su,int c,string pr,string de);void Show();private:teacher t;};TA::TA(teacher t1,people p,string su,int c,string pr,string de):people(p),graduate(t1,p,c,su),teacher(p,pr,de){}void TA::Show(){graduate::Show();cout<<"职务:"<<teacher::GetPrincipalship()<<endl;cout<<"部门:"<<teacher::GetDepartment()<<endl;}int main(){cout<<"Student:"<<endl;people a1("001","小明","男",1990,2,28,"201313138064");student b(a1,30) ;b.Show();cout<<endl;cout<<"Teacher:"<<endl;people a2("002","小红","女",1991,5,12,"201313138065");teacher c(a1,"助教","武汉科技大学");c.Show();cout<<endl;cout<<"Graduate:"<<endl;people a3("003","小李","男",1990,4,28,"201313138066");graduate d(c,a3,30,"软件工程");d.Show();cout<<endl;cout<<"TA:"<<endl;people a4("004","老王","男",1980,7,8,"2198080808067");TA e(c,a4,"软件工程",30,"教授","武汉科技大学");e.Show();return 0;}程序运行结果:UML图:。
实验8(继承与派生)
实验八继承与派生一、实验目的1、进一步理解类的概念、定义及其对象的简单操作。
2、学习继承的概念。
3、理解继承与组合的不同。
4、理解如何使用继承。
5、理解如何定义派生类的构造函数及拷贝构造函数。
6、理解多继承的概念。
二、实验内容及步骤一、选择题(1)下面描述中,表达错误的是()A)公有继承时基类中的public成员在派生类中仍是public的B)公有继承是基类中的private成员在派生类中仍是private的C)公有继承时基类中的protected成员在派生类中仍是protected的D)私有继承时基类中的public成员在派生类中是private的(2)应在下列程序划线处填入的正确语句是()#includeclass Base{public:void fun(){cout<<"Base::fun"<};class Derived:public Base{void fun(){_____________ //显示调用基类的函数fun()cout<<"Derived::fun"<<endl;}};A)fun(); B)Base.fun(); C)Base::fun(); D) Base->fun();(3)可以用p.a的形式访问派生类对象p的基类成员a,则a是( )A .私有继承下的公有成员 B. 公有继承下的私有成员C. 公有继承下的保护成员D. 公有继承下的公有成员(4)如果是类B在类A的基础上构造,那么,就称()。
A. 类A为基类或父类,类B为超类或子类B. 类A为基类、父类或超类,类B为派生类或子类C. 类A为派生类,类B为基类D. 类A为派生类或子类,类B为基类、父类或超类(5)C++的继承性允许派生类继承基类的()。
A. 部分特性,并允许增加新的特性或重定义基类的特性B. 部分特性,但不允许增加新的特性或重定义基类的特性C. 所有特性,并允许增加新的特性或重定义基类的特性D. 所有特性,但不允许增加新的特性或重定义基类的特性(6)派生类的成员函数可以直接访问基类的()成员。
- 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(类实现文件)
报告的书写注意事项:
报告包括实验目的,实验内容,实验设计(指出主要函数或者类,必要时附流程图),核心代码,运行结果,心得体会。