C实验三继承和派生类(附答案解析)

合集下载

c 继承与派生实验报告

c 继承与派生实验报告

c 继承与派生实验报告
C 继承与派生实验报告
实验目的:通过实验,掌握C语言中继承与派生的概念和使用方法,加深对面向对象编程的理解。

实验内容:在C语言中,继承与派生是面向对象编程中非常重要的概念。

在本次实验中,我们将通过一个简单的例子来演示C语言中的继承与派生的用法。

首先,我们定义一个基类(父类)Person,包括姓名和年龄两个成员变量,以及一个显示信息的成员函数。

然后,我们定义一个派生类(子类)Student,继承自Person类,新增一个成员变量学号,并重写显示信息的成员函数。

在实验中,我们首先创建一个Person对象,设置姓名和年龄,然后调用显示信息函数,观察结果。

接着,我们创建一个Student对象,设置姓名、年龄和学号,再次调用显示信息函数,观察结果。

实验结果:通过实验,我们成功实现了C语言中的继承与派生。

我们发现,通过继承,子类Student可以直接使用父类Person中的成员变量和成员函数,同时可以新增自己的成员变量和函数。

这样的设计使得代码更加简洁和灵活,提高了代码的复用性和可维护性。

结论:C语言中的继承与派生是面向对象编程中非常重要的概念,通过本次实验,我们深入理解了这一概念的用法和意义。

掌握了继承与派生的方法后,我们可以更加灵活地设计和编写程序,提高代码的质量和效率。

总结:通过本次实验,我们对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++语言程序设计实验答案_继承与派生教学提纲

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 第八章继承与派生习题习题解答

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继承与派生习题答案

c继承与派生习题答案
1.3派生类的构造函数一般殳有3项工作要完成:首先_基类初始化一,其次—成员 对象初始化,最后_执行派生类构造函数体_。
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语言程序设计实验答案继承与派生

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改为公有变量后重新编译就可以了。

(C++)实验报告六:继承与派生

(C++)实验报告六:继承与派生

实验6 继承与派生一、实验目的1.理解继承与派生、单继承与多继承的概念;2.理解基类与派生类的定义及使用方法,派生类对象的定义与初始化方法;3.理解继承与派生过程中,把派生类作为基类构成类族的概念及虚基类的概念。

二、实验环境一台PC机,Windows XP操作系统,Visual C++ 6.0开发环境。

三、实验内容1、由在校人员类(Person)作为基类派生出学生类(Student):实验步骤:#include <iostream>#include <string>using namespace std;class Person{public:Person(int i,char *n, char s, int a){ID=i;name=n;sex=s;age=a;};int getID(){return ID;}void show(){cout<<"ID: "<<ID<<endl;cout<<"name : "<<name<<endl;cout<<"sex: "<<sex<<endl;cout<<"age: "<<age<<endl;}private:int ID;string name;char sex;int age;};class Student:public Person{public:Student(int i,char *n,char s,int a,float m,float p,float e,float c):Person(i,n,s,a){math=m;physical=p;english=e;cpp=c;total=math+physical+english+cpp;}void show(){Person::show();cout<<"math: "<<math<<endl;cout<<"physical: "<<physical<<endl;cout<<"english: "<<english<<endl;cout<<"C++: "<<cpp<<endl;cout<<"total: "<<total<<endl;}private:float math,physical,english,cpp,total;};void main(){Person p1(1,"张帅",'M',22);p1.show();cout<<endl;Student s1(9901,"林维",'S',21,65,70,75,88);s1.show();}实验结果:2、由学生类、课程类作为基类,共同派生出选课类。

C++实验三继承和派生类(附答案)

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.调试下列程序,并对程序进行修改后再调试,指出调试中的出错原因。

继承与派生类答案

继承与派生类答案

继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。

(1)掌握继承的两种类型:单继承和多继承。

(2)掌握private,public,protected三种继承方式的特点。

继承方式决定了基类中的成员在派生类中的属性。

三种继承方式的共同点:基类的private成员在派生类中不可见。

区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。

(3)掌握派生类中的构造函数和析构函数的使用。

基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。

派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。

(4)掌握派生类的同名覆盖规则。

(5)掌握赋值兼容规则。

基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。

2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。

派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。

3.掌握虚基类的概念和定义方法。

在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。

典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。

继承与派生类答案

继承与派生类答案

继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。

(1)掌握继承的两种类型:单继承和多继承。

(2)掌握private,public,protected三种继承方式的特点。

继承方式决定了基类中的成员在派生类中的属性。

三种继承方式的共同点:基类的private成员在派生类中不可见。

区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。

(3)掌握派生类中的构造函数和析构函数的使用。

基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。

派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。

(4)掌握派生类的同名覆盖规则。

(5)掌握赋值兼容规则。

基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。

2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。

派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。

3.掌握虚基类的概念和定义方法。

在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。

典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。

C++继承和派生编程参考答案

C++继承和派生编程参考答案

继承和派生练习一1.以日期类cDate(有数据成员年月日)为基类派生日期时间类cTime,新增数据成员时分秒,要求有构造函数、输出所有成员的函数,测试程序正确性。

#include<iostream.h>class cDay{int ye,mo,da;public:cDay(int a=2000,int b=1,int c=1){ye=a,mo=b,da=c;}void Dout(void){cout<<ye<<' '<<mo<<' '<<da<<endl;}};class cTime:public cDay{int ho,mi,se;public:cTime(int a=2000,int b=1,int c=1,int d=12,int e=12,int f=12):cDay(a,b,c){ho=d,mi=e,se=f;}void Tout(void){Dout();cout<<ho<<' '<<mi<<' '<<se<<endl;}};void main(void){cTime t1(2010,4,30,15,20,23);t1.Tout();}2.以三维坐标类cPoint为基类派生圆类cCircle,新增数据成员半径;再以圆类为基类派生圆柱体类cColumn,新增数据成员高度,要求有构造函数、输出所有成员的函数,在相关类中定义求圆面积的成员函数、求体积的成员函数,测试程序正确性。

#include<iostream.h>#define PI 3.1415926class cPoint{float x,y,z;public:cPoint(float a=1,float b=1,float c=1){x=a,y=b,z=c;}void Pout(void){cout<<"x="<<x<<" y="<<y<<" z="<<z;}};class cCircle:public cPoint{float r;public:cCircle(float a=1,float b=1,float c=1,float d=2):cPoint(a,b,c){r=d;}float area(void){return PI*r*r;}void Cout(void){Pout();cout<<" r="<<r;}};class cColumn:public cCircle{float h;public:cColumn(float a=1,float b=1,float c=1,float d=2,float e=3):cCircle(a,b,c,d){ h=e;}float v(void){return area()*h;}void Coout(void){Cout();cout<<" h="<<h<<endl;}};void main(void){cCircle t1(1,2,3,4);t1.Cout();cout<<" area="<<t1.area()<<endl;cColumn t2(2,3,4,5,6);t2.Coout();cout<<"v="<<t2.v()<<endl;}。

c 派生类与继承实验报告

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++实验三 派生类与继承

C++实验三 派生类与继承

实验三派生类与继承班级:123班姓名:朱广金学号:122536一、实验目的1、学习类的继承,能够定义和使用类的继承关系。

2、学习派生类的声明与定义方法。

3、掌握类的定义和对象的声明。

4、熟悉公有派生和私有派生的访问特性。

5、掌握派生类构造函数和析构函数的执行顺序。

6、掌握利用访问声明调整基类成员在派生类中的访问属性。

*****************************************************//**************************************************************************二、试验内容1、下面的程序可以输出ASCII字符与所对应的数字的对照表。

修改下列程序,使其可以输出字母a到z(或任意两个字符间)与所对应的数字的对照表。

***************************************************************************#include<iostream>/****************iomanip的作用:*主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。

它是I/O流控制头文件,就像C里面的格式化输出一样.以下是一些常见的控制函数的:*dec 置基数为10 相当于"%d"*hex 置基数为16 相当于"%X"*oct 置基数为8 相当于"%o"*setfill( 'c' ) 设填充字符为c*setprecision( n ) 设显示有效数字为n位*setw( n ) 设域宽为n个字符*这个控制符的意思是保证输出宽度为n。

************************************#include <iomanip>using namespace std;//基类class table{public://构造函数table(char p,char q){i=p;j=q;}void ascii(void);protected:char i;char j;};///////////////////////////////////////////////////////void table::ascii(void){int k=1;for (;i<=j;i++){cout<<setw(4)<<i<<(int)i;if((k)%12==0) //每12个换行cout<<"\n";k++;}cout<<"\n";}//派生类class der_table:public table{public:der_table(char p,char q,char *m):table(p,q)//派生类的构造函数{c=m;}void print(void);protected:char *c;};//////////////////////////////////////////////////////////void der_table::print(void){cout<<c<<"\n";table::ascii();}//主函数int main(){der_table obl('a','z',"ASCII value---char");obl.print();return 0;/*****************************************提示:修改后的主程序为:int main(){der_table ob('a','z',"ASCII value---char");ob.print();return 0;}*******************************************//*********************************************************************2、已有类Time和Date,要求设计一个派生类Birthtime,*它继承类Time和Date,并且增加一个数据成员Childname用于表示小孩的名字,*同事设计主程序显示一个小孩的出生时间和名字。

C 继承与派生实验报告

C 继承与派生实验报告

C 继承与派生实验报告1. 引言继承与派生是面向对象编程中的基本概念之一,C语言作为一门面向过程的编程语言,也支持继承与派生的概念。

本实验旨在通过编写代码演示C语言中的继承与派生的使用方法,加深对这一概念的理解。

2. 继承与派生的概念继承是一种面向对象编程中的重要概念,通过继承,派生类可以继承基类的属性和方法。

在C语言中,继承是通过结构体嵌套的方式实现的。

派生是继承的一种特殊形式,通过派生,派生类可以在基类的基础上增加新的属性和方法。

3. 实验步骤步骤一:定义基类首先,我们需要定义一个基类,基类包含一些公共的属性和方法。

在C语言中,我们可以使用结构体来定义类。

typedef struct {int x;int y;} Point;上述代码定义了一个名为Point的结构体,它包含了两个整型属性x和y。

这个结构体可以看作是基类。

步骤二:定义派生类接下来,我们可以定义派生类,派生类通过嵌套包含基类的结构体来实现继承。

typedef struct {Point base; // 基类结构体int z; // 派生类自己的属性} Point3D;上述代码定义了一个名为Point3D的结构体,它嵌套包含了基类Point的结构体,并新增了一个整型属性z。

这个结构体可以看作是派生类。

步骤三:使用派生类在定义好派生类后,我们可以使用派生类来创建对象,并调用基类的属性和方法。

int main() {// 创建对象Point3D point3d;point3d.base.x = 1;point3d.base.y = 2;point3d.z = 3;// 调用基类属性printf("x: %d\n", point3d.base.x);printf("y: %d\n", point3d.base.y);// 调用派生类自己的属性printf("z: %d\n", point3d.z);return0;}上述代码示例了如何使用派生类创建对象,并访问基类的属性和派生类自己的属性。

C++类的继承与派生 实验报告

C++类的继承与派生 实验报告

Guangxi University of Science and Technology实验报告实验课程: C++程序设计教程实验内容:类的继承与派生院(系):专业:班级:学生姓名:学号:指导教师:2013年 11 月 11日一.实验目的:1、掌握利用单继承和多继承的方式定义派生类的方法。

2、深刻理解在各种继承方式下构造函数和析构函数的执行顺序。

3、理解和掌握公有继承、私有继承和保护继承对基类成员的访问机制。

4、理解虚基类的目的和作用。

二.实验内容(-)实验题目一:声明一个圆类作为基类,含成员数据半径R;有成员函数:构造函数实现对基类成员数据的初始化、计算圆面积的成员函数、输出的成员函数,要求输出圆半径R。

把圆类作为基类,通过公有继承,派生圆柱体类,派生类新增成员数据有高(H);新增成员函数有构造函数、计算圆柱体体积的函数、输出所有成员的函数。

main()完成派生类对象的定义和相关函数的测试。

2.程序源代码:#include<iostream>using namespace std;class round{public:round(float m){rad=m;}float space(){sp=3.14*rad*rad;return sp;}void display(){cout<<"the round of information"<<endl;cout<<"该圆半径: "<<rad<<endl;cout<<"该圆面积: "<<space()<<endl;}protected:float rad;float sp;};class cylinder: public round{public:cylinder(float m,float n):round(m){high=n;}void gethigh(float n){high=n;}float room(){bulk=3.14*rad*rad*high;return bulk;}void play(){cout<<"the cylinder of information:"<<endl;cout<<"该圆柱高: "<<high<<endl;cout<<"该圆柱体积: "<<room()<<endl;}protected:float high;float bulk;};int main(){float m,n;cout<<"输入该圆半径:"; cin>>m;cout<<"输入该圆柱高:";cin>>n;cylinder ss(m,n);ss.display();ss.play();}3.实验结果:(二)实验题目二:声明一个学生类,有成员函数:学号、姓名、性别、年龄,要求有如下成员函数:构造函数,输出所有成员的函数。

C++实验报告--继承和派生

C++实验报告--继承和派生
cout<<"Teacher constructing...."<<endl;
}
void show(){
Person::show();
cout<<"Teacher lesson:"<<lesson<<endl;
}
};
class Student:virtual public Person{
private:
{
cout<<"constructing...."<<endl;
}
void show(){
cout<<"YJSZJ:"<<endl;
Teacher::show();
Student::show();
}
};
void main(){
YJSZJ x(21,50,98.0,99.0,97.0,5000,02);
}
void show_biaomianji()
{
cout<<"表面积:"<< "2*(A*B+A*H+B*H)= "<<2*(A*B+A*H+B*H)<<" (cm2)"<<endl;;
}
};
void main(){
Point C(6,8),D(3,4);
C.showXY();
D.showXY();
int H;
public:
Cuboid(int H,int A,int B,int X,int Y):Rectangle(A,B,X,Y)

C 继承与派生实验报告

C  继承与派生实验报告

C 继承与派生实验报告C 继承与派生实验报告引言:在计算机编程领域,继承与派生是一种重要的概念。

通过继承,我们可以构建更加复杂和灵活的程序结构,提高代码的可重用性和可维护性。

本实验旨在通过实际操作和分析,深入理解C语言中继承与派生的原理和应用。

实验目的:1. 理解继承与派生的概念和原理;2. 掌握C语言中继承与派生的语法和用法;3. 实践继承与派生的应用,加深对其理解。

实验步骤:1. 创建基类和派生类:首先,我们创建一个基类Animal,其中包含一个成员函数eat()和一个成员变量name。

然后,我们创建一个派生类Dog,继承自基类Animal,并添加一个成员函数bark()和一个成员变量breed。

2. 实现继承与派生的功能:在基类Animal中,实现成员函数eat(),用于输出动物的进食行为。

在派生类Dog中,实现成员函数bark(),用于输出狗的吠叫行为。

同时,通过继承,派生类Dog可以直接访问基类Animal中的成员变量name。

3. 测试继承与派生的效果:在主函数中,创建一个Dog对象,并调用其成员函数eat()和bark(),以验证继承与派生的功能是否正常工作。

同时,可以通过修改派生类Dog的成员变量breed,观察其对程序运行结果的影响。

实验结果与分析:通过实验,我们可以发现继承与派生的强大功能。

基类Animal提供了一种通用的行为eat(),而派生类Dog则通过添加成员函数bark(),实现了更加具体和特定的行为。

这种继承与派生的关系,使得我们可以在保留原有功能的基础上,进行灵活的扩展和定制。

此外,通过继承,派生类Dog可以直接访问基类Animal中的成员变量name。

这种继承的特性,使得派生类可以共享基类的数据,避免了重复定义和冗余代码的问题。

同时,通过修改派生类Dog的成员变量breed,我们可以看到其对程序运行结果的影响。

这种灵活性,使得我们可以根据具体需求,定制不同的派生类,实现更加个性化的功能。

C继承与派生

C继承与派生

第4章继承与派生一、简答题1. 有以下程序结构,请分析访问属性。

class A //A为基类{public:void func1( );int i;protected:void func2( );int j;private:int k;} ;class B: public A //B为A的公用派生类{public :void func3( ) ;protected:int m;private :int n;};class C: public B // C为B的公用派生类{public:void func4( );private:int p;};int main( ){ A a; //a是基类A的对象B b; //b是派生类B的对象C c; //c是派生类C的对象return 0;}问:(1)在main函数中能否用b.i,b.j 和b.k 访问派生类B对象b中基类A的成员?(2)派生类B中的成员函数能否调用基类A中的成员函数func1和func2?(3)派生类B中的成员函数能否访问基类A中的数据成员i,j,k?(4)能否在main函数中用c.i,c.j,c.k,c.m,c.n,c.p访问基类A的成员i,j,k,派生类B的成员m,n,以及派生类C的成员p?(5)能否在main函数中用c. func1( ),c. func2( ),c. func3( )和c. func4( )调用func1,func2,func3,func4成员函数?(6)派生类C的成员函数func4能否调用基类A中的成员函数func1,func2和派生类B中的成员函数func3?【答案要点】各成员在各类的范围内的访问权限如下表:(1)在main 函数中能用b.i访问派生类B对象b中基类A的成员i,因为它在派生类B中是公用数据成员。

不能用b.j访问派生类B对象b中基类A的成员j,因为它在派生类B中是保护数据成员,不能被类外访问。

不能用b.k访问派生类B对象b中基类A的成员k,因为它是基类A的私用数据成员,只有基类A的成员函数可以访问,不能被类外访问。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三继承和派生类实验目的和要求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();}(4)#include<iostream.h>class Base1public: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.调试下列程序,并对程序进行修改后再调试,指出调试中的出错原因。

* * #include <iostream.h>class A{public:void seta(int i){ a=i; }int geta(){ return a; }public:int a;};class B:public A{public:void setb(int i){ b=i; }int getb(){ return b; }void show(){ cout<<"A::a="<<a<<endl; } //语句9public:int b;};void main(){B bb; //语句1bb.seta(6); //语句2bb.setb(3); //语句3bb.show(); //语句4cout<<"A::a="<<bb.a<<endl; //语句5cout<<"B::b="<<bb.b<<endl; //语句6cout<<"A::a="<<bb.geta()<<endl; //语句7cout<<"B::b="<<bb.getb()<<endl; //语句8}按下列要求对程序进行修改,然后调试,对出现的错误分析其原因。

(1)将派生类B的继承方式改为private时,会出现哪些错误和不正常现象?为什么?(2)将派生类B的继承方式改为protected时,会出现哪些错误和不正常现象?为什么?(3)将派生类B的继承方式恢复为public后,再将类A中数据成员a的访问权限改为private时,会出现哪些错误和不正常现象?为什么?(4)派生类B的继承方式仍为public,将类A中数据成员a的访问权限改为protected 时,会出现哪些错误和不正常现象?为什么?3.定义一个类MyArray,类中可以存放一组整数。

类的定义如下:class MyArray{public:MyArray(int len); //初始化,动态申请存储空间~MyArray(); //对象结束时,释放所占用的存储空间void Input(); //输入数据void Display(); //显示数据protected:int *alist; //指向动态申请的一组空间int length; //整数的个数};基类中有构造函数、析构函数、输入数据和输出数据的函数。

(1)实现该类并设计主函数对所定义的类进行调试。

下同。

(2)由MyArray派生一个类SortArray,在该类中定义函数实现排序功能。

(3)由MyArray派生一个类ReArray,在该类中定义函数实现数据前后逆转功能。

(4)由MyArray派生一个类AverArray,在该类中定义函数Aver求解类中所有数据的平均值。

(5)定义NewArray类,同时继承了SortArray, ReArray和AverArray,使得NewArray类的对象同时具有排序、逆转和求平均值的功能。

在继承的过程中声明为虚基类,体会虚基类在解决二义性问题中的作用。

参考答案(非权威,仅仅是我自己的理解,如有错误,欢迎批评指正!)1.(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出现错误。

相关文档
最新文档