c++实验三继承和派生类(附答案)
c 继承与派生实验报告

c 继承与派生实验报告
C 继承与派生实验报告
实验目的:通过实验,掌握C语言中继承与派生的概念和使用方法,加深对面向对象编程的理解。
实验内容:在C语言中,继承与派生是面向对象编程中非常重要的概念。
在本次实验中,我们将通过一个简单的例子来演示C语言中的继承与派生的用法。
首先,我们定义一个基类(父类)Person,包括姓名和年龄两个成员变量,以及一个显示信息的成员函数。
然后,我们定义一个派生类(子类)Student,继承自Person类,新增一个成员变量学号,并重写显示信息的成员函数。
在实验中,我们首先创建一个Person对象,设置姓名和年龄,然后调用显示信息函数,观察结果。
接着,我们创建一个Student对象,设置姓名、年龄和学号,再次调用显示信息函数,观察结果。
实验结果:通过实验,我们成功实现了C语言中的继承与派生。
我们发现,通过继承,子类Student可以直接使用父类Person中的成员变量和成员函数,同时可以新增自己的成员变量和函数。
这样的设计使得代码更加简洁和灵活,提高了代码的复用性和可维护性。
结论:C语言中的继承与派生是面向对象编程中非常重要的概念,通过本次实验,我们深入理解了这一概念的用法和意义。
掌握了继承与派生的方法后,我们可以更加灵活地设计和编写程序,提高代码的质量和效率。
总结:通过本次实验,我们对C语言中的继承与派生有了更深入的理解,加深了对面向对象编程的认识。
在今后的学习和工作中,我们将更加灵活地运用继承与派生的方法,提高代码的质量和效率。
C 继承与派生实验报告

C 继承与派生实验报告C 继承与派生实验报告引言:在面向对象的编程中,继承与派生是重要的概念。
通过继承,我们可以从已有的类中派生出新的类,并且可以在新的类中添加额外的属性和方法。
本实验旨在通过实际的编程实践,深入理解C语言中的继承与派生。
实验过程:首先,我们创建了一个基类Animal,其中包含了一个成员变量name和一个成员函数eat。
然后,我们创建了两个派生类Dog和Cat,它们分别继承了Animal类,并且在其中添加了各自特有的成员函数bark和meow。
接着,我们创建了一个对象dog和一个对象cat,并分别调用了它们的成员函数eat、bark 和meow。
实验结果:通过运行程序,我们可以看到dog对象调用了eat和bark函数,而cat对象调用了eat和meow函数。
这说明继承与派生的机制正常工作,派生类可以继承基类的属性和方法,并且可以在派生类中添加新的属性和方法。
实验分析:继承与派生是面向对象编程的重要概念,它可以使得代码的复用性更高,同时也增加了代码的灵活性。
通过继承,派生类可以继承基类的属性和方法,这样可以减少代码的冗余,并且可以在派生类中添加新的功能。
在本实验中,Dog 和Cat类分别继承了Animal类,这样它们就拥有了相同的属性name和方法eat。
然后,通过在派生类中添加新的方法bark和meow,我们可以实现不同的行为。
继承与派生的应用:继承与派生在实际的软件开发中有着广泛的应用。
例如,在一个图形界面程序中,可以定义一个基类Widget,它包含了一些基本的属性和方法,然后可以通过派生类Button和TextBox来创建具体的按钮和文本框。
这样,我们可以通过继承和派生的方式,实现不同的界面元素,并且可以在派生类中添加新的功能,如按钮的点击事件和文本框的输入验证。
继承与派生的注意事项:在使用继承与派生的过程中,我们需要注意一些问题。
首先,派生类可以访问基类的公有成员,但不能访问基类的私有成员。
C++程序设计与应用基础第四章继承与派生习题答案

第四章继承与派生1、填空题1)在派生类中使用基类的成员,可以显示地使用___成员名限定符__来使用基类成员。
2)垂直访问时,保护成员的访问控制权限与____公有_____成员相同3)指向基类的对象的指针变量也可以指向___派生类____的对象。
4)若类Y是类X的私有派生类,类Z是类Y的派生类,则类Z__不能___访问类X的保护成员与公有成员。
5)在划线处填上适当的语句,完成下列程序。
#include <math.h>class Point{public:point(double a,double b,double c){___X=a;Y=b;Z=c;___}double Getx(){return X;}double Gety(){return Y;}double Getz(){return Z;}private:______double X;______protected:_____double Y,Z;_____};class Line :_____public______Point{public:Line(double a ,double b,double c,double d)_____:point(a,b,c)__{_ k=d;_ }void show(){cout<<Getx()<<endl;cout<<Gety()<<““<<.<<<endl;cout<<Getz()<<““<<Z<<endl;cout<<K<<endl;}private:double k;};void main(){Line obj(1.2,3.4,5.6,7.8);obj.show();}6)设置虚基类的目的是__解决二义性问题___,可通过___关键字virtual__标识虚基类。
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改为公有变量后重新编译就可以了。
C 第八章继承与派生习题习题解答

第八章继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。
(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。
如果强制转换则要注意(6)。
答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。
公有派生可以使其类的(4),所以公有派生是主流。
答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。
继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。
答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.6 C++中多态性包括两种多态性:(1)和(2)。
前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。
答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.2简答题(以下习题题号可能和教材不一致!)8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。
派生类构造函数各部分的执行次序是:1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。
2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。
3.派生类的构造函数体中的操作。
8.2.2什么叫派生类的同名覆盖(override)?答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。
c派生类与继承实验报告

实验2 派生类与继承实验课程名:面向对象程序设计(C++)专业班级:学号::实验时间:实验地点:指导教师:二、实验内容一、构造一个类Geometry 及其派生类,该类主要实现关于几何图形的基本操作。
对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。
试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。
实验代码如下:#include<iostream>using namespace std;class Geometry{public:CircleradiumsCircle()~Circle() BallBall()~Ball() GeometryGeometry()~Geometry()GetArea()GetPerimeter()Getcolume()show()Column Column()~Column()Rectangle Rectangle() ~Rectangle()Column column(1,2,3);column.show();return 0;}运行结果:代码分析:1)首先定义基类Geometry,在定义基类的派生类Circle,Rectangle再定义以Circle,Rectangle为基类的派生类Column,以及以Circle为基类的派生类Ball;2)在定义派生类时用构造函数初始化私有成员;3)最后用类的对象来调用类函数;二、设计如下类:(1)建立一个Point类,表示平面中的一个点;建立一个Line类,表示平面中的一条线端,内含两个Point类的对象;建立Triangle类,表示一个三角形,内含三个Line类的对象构成一个三角形。
(2)设计三个类的相应的构造函数、复制构造函数,完成初始化和对象复制(3)设计Triangle类的成员函数完成三条边是否能构成三角形的检验和三角形面积计算,面积显示。
c继承与派生习题答案

1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现—二
义性一。在派生类中采用_虚基类_或_作用域分辨符一来消除该问题。
3.选择题
3.1下面对派生类的描述中,错误的是(D)。
};
class MyDERIVED: protected MyBASE{ protected;
int j;
public:
void set(int m,int n){MyBASE::set(m);j=n;}
int get()const{return MyBASE::get( )+j;}
};
则类MyDERIVED中保护成员个数是(B)。
概念填空题
1.1在C++中,三种派生方式的说明符号为_public_、_private.、protected不加 说明,则默认的派生方式为private.。
1.2当公有派生时,基类的公有成员成为派生类的公有成员保护成员成为派
生类的_保护成员;私有成员成为派生类的—不能直接访问成员_。当保护派生时, 基类的公有成员成为派生类的—保护成员;保护成员成为派生类的—保护成员 私有成员成为派生类的—不能直接访问成员_。
A.—个派生类可以作为另外一个派生类的基类
B.派生类至少有一个基类
C.派生类的成员除了它自己的成员外,还包含了它的基类的成员
D.派生类中继承的基类成员的访问权限到派生类中保持不变
3.2下列对友元关系叙述正确的是(A)。
A.不能继承
B.是类与类的关系
C.是一个类的成员函数与另一个类的关系
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改为公有变量后重新编译就可以了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三继承和派生类实验目的和要求1.理解类的继承的概念,能够定义和使用类的继承关系。
2.掌握派生类的声明与定义方法。
3.熟悉公有派生和私有派生的访问特性。
4.学习虚基类在解决二义性问题中的作用。
实验内容1.先阅读下面的程序,分析程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include<>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:c har *buf;};void main(){B b(10);}(2)#include<>class A{public:A(int a,int b):x(a),y(b){cout<<"A constructor..."<<endl;}v oid Add(int a,int b){x+=a;y+=b;}v oid display(){cout<<"("<<x<<","<<y<<")"<<endl;}~A(){cout<<"destructor A..."<<endl;}private:i nt x,y;};class B:private A{private:i nt 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;}v oid Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2;j+=y2;}v oid display()A::display();();cout<<"("<<i<<","<<j<<")"<<endl; }~B(){cout<<"destructor B..."<<endl;}};void main(){B b(1,2,3,4);();(1,3,5,7);();}(3)#include<>class A{public:A(int a):x(a){cout<<"A constructor..."<<x<<endl; }i nt f(){return ++x;}~A(){cout<<"destructor A..."<<endl;}private:i nt x;};class B:public virtual A{private:i nt y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c)cout<<"B constructor..."<<y<<endl;}i nt f(){A::f();();return ++y;}v oid display(){cout<<A::f()<<'\t'<<()<<'\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);();();}(4)#include<>class Base1{public:B ase1(){cout<<"class Base1!"<<endl;}};class Base2{public:B ase2(){cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1{public:L evel1(){cout<<"class Level1!"<<endl;}};class Level2:public Base2,virtual public Base1{public:L evel2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2 {public:T opLevel(){cout<<"class TopLevel!"<<endl;}};void main(){T opLevel obj;}2.调试下列程序,并对程序进行修改后再调试,指出调试中的出错原因。
#include <>class A{public:v oid seta(int i){a=i; }i nt geta(){return a; }public:i nt a;};class B:public A{public:v oid setb(int i){b=i; }i nt getb(){return b; }v oid show(){cout<<"A::a="<<a<<endl; } 义一个类MyArray,类中可以存放一组整数。
类的定义如下:class MyArray{public:MyArray(int len); 1)1.(2)1.(3)1.(4)2.(1)主函数中语句2、语句5、语句7出现错误。
因为B采用私有继承,所以A中的公有函数在B中是变为私有函数,主函数中不能访问B中的私有函数。
(2)主函数中语句2、语句5、语句7出现错误。
因为B采用保护继承,所以A中的公有函数在B中是变为保护函数,主函数中不能访问B中的保护函数。
(3)主函数中语句9、语句5出现错误。
因为B采用公有继承,所以B中和主函数中不能访问A中的私有函数。
(4)主函数中语句5出现错误。
因为B采用公有继承,所以A中保护成员在B中仍为保护成员,B中可以访问A中的保护成员,但不能通过类的对象访问类的保护成员。
3.(1)#include <>class Myarray{protected:int *alist; ."<<endl;}~Myarray() ."<<endl;}void sort(){int i,j,k,temp;for(i=0;i<length-1;i++){k=i;for(j=i+1;j<length;j++)if(alist[j]<alist[k]){k=j;}temp=alist[i];alist[i]=alist[k];alist[k]=temp;}}};void main(){SortArray B(4);();();cout<<endl<<"现在将数组内成员进行从小到大排序:"<<endl;();();}(3)#include <>class Myarray{protected:int *alist; ."<<endl;}~Myarray() ."<<endl;}void turn(){int i,t,j=length-1;for(i=0;i<length/2;i++,j--){t=alist[i];alist[i]=alist[j];alist[j]=t;}}};void main(){ReArray B(4);();();cout<<endl<<"现在将数组内成员进行前后逆转:"<<endl;();();}(4)#include <>class Myarray{protected:int *alist; ."<<endl;}~Myarray() ."<<endl;}float getaver(){float aver;int sum=0,i;for(i=0;i<length;i++)sum+=alist[i];aver=(float)sum/length;return aver;}};void main(){AverArray B(3);();();cout<<endl<<"数组内成员的平均值为:";cout<<()<<' '<<endl;}(5)#include <>class Myarray{protected:int *alist; ."<<endl;}~Myarray() ."<<endl;}void get_SortArray(){int i,j,k,temp;for(i=0;i<length-1;i++){k=i;for(j=i+1;j<length;j++)if(alist[j]<alist[k]){k=j;}temp=alist[i];alist[i]=alist[k];alist[k]=temp;}}};class ReArray: virtual public Myarray ."<<endl;}void get_ReArray(){int i,t,j=length-1;for(i=0;i<length/2;i++,j--){t=alist[i];alist[i]=alist[j];alist[j]=t;}}};class AverArray:virtual public Myarray ."<<endl;}float get_AverArray(){float aver;int sum=0,i;for(i=0;i<length;i++)sum+=alist[i];aver=(float)sum/length;return aver;}};class NewArray:public SortArray,public ReArray,public AverArray{public:NewArray(int n):SortArray(n),ReArray(n),AverArray(n),Myarray(n) {cout<<"NewArray 初始化..."<<endl;}void fun(){cout<<endl<<"数组成员的平均值为:";cout<<AverArray::get_AverArray()<<' '<<endl;cout<<endl<<"现在将数组成员进行前后逆转:"<<endl;ReArray::get_ReArray();Myarray::Display();cout<<endl<<"现在将数组成员进行从小到大排序:"<<endl;SortArray::get_SortArray();Myarray::Display();}};void main(){NewArray B(3);();();();}。