实验8 继承与派生
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 班、学号3111008106姓名吴伟栓教师评定_________________实验题目继承与派生一、实验目的与任务实验目的:(1)学习声明和使用类的继承关系,声明派生类。
(2)熟悉不同继承方式下对基类成员的访问控制。
(3)学习利用虚基类解决二义性问题。
实验任务:(1)声明一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。
(2)声明一个基类BaseClass,有整形成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
(3)声明一个车(vehicle)基类,具有MaxSpeed,Weight等成员变量,Run,Stop 等成员函数,由此派生出自行车(bicycle)类,汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。
从bicycle 和motorcar派生出摩托车(motocycle)类,在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?编程试试看。
(4)(选做)从实验六中的people(人员)类派生出student(学生)类,添加属性:班号char classNo[7];从people类派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。
从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacherradviser;从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。
C语言程序设计基础-实验八继承与派生类
实验八继承与派生类1.实验目的要求(1)掌握单继承程序设计的基本方法。
(2)掌握多继承程序设计的基本方法。
2.实验设备电脑一台,Microsoft Visual C++ 6.03.实验内容(1) 下面程序定义一个vehicle类,并派生出car和truck两个派生类。
#include<iostream.h>class vehicle{protected:int wheels;double weight;public:void initialize(int whls, double wght);int get_wheels() { return wheels; }double get_weight() { return weight; }double wheel_loading() { return weight/wheels; } };class car: public vehicleprivate:int passenger_load;public:void initialize(int whls, double wght, int people =4);int passengers() { return passenger_load; }};class truck: public vehicle{private:int passenger_load;double payload;public:void init_truck(int number =2, double max_load =24000.0);double efficiency();int passengers() { return passenger_load; }};void vehicle::initialize(int whls, double wght){wheels=whls;weight=wght;}void car::initialize(int whls, double wght, int people){wheels=whls;weight=wght;passenger_load=people;void truck::init_truck(int number, double max_load){passenger_load=number;payload=max_load;}double truck::efficiency(){return payload/(payload+weight);}void main(){vehicle bicycle;bicycle.initialize(2,25);cout<<"the bicycle has "<<bicycle.get_wheels()<<" wheels.\n";cout<<"the bicycle weighs "<<bicycle.get_weight()<<" pounds.\n";cout<<"the bicycle's wheel loading is "<<bicycle.wheel_loading()<<" pounds per tire.\n\n";car audi;audi.initialize(4,3500.0,5);cout<<"the audi has "<<audi.get_wheels()<<" wheels.\n";cout<<"the audi weighs "<<audi.get_weight()<<" pounds.\n";cout<<"the audi's wheel loading is "<<audi.wheel_loading()<<" pounds per tire.\n\n";truck jief;jief.initialize(18,12500.0);person person teacher graduate in-service_graduatejief.init_truck(2,33675.0);cout<<"the jief has "<<jief.get_wheels()<<" wheels.\n";cout<<"the jief weighs "<<jief.get_weight()<<" pounds.\n";cout<<"the jief's efficiency is "<<100.0*jief.efficiency()<<" percent.\n";}[基本要求]● 上机录入、调试上面程序。
继承和派生实验报告
实验目的与要求:1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。
2.掌握派生类构造函数初始化基类成员和对象成员的方法。
3.掌握内联函数和默认函数。
4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。
实验过程及内容:1.实践教程实验二十二P81范例:定义一个继承与派生关系的类体系,在派生类中访问基类成员。
①先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员;②以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数;③定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。
编程测试所定义的类体系。
本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。
2. 实践教程P83编程:多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。
要求计算圆柱的底面积、侧面积、全面积和体积。
请编写所有完整的成员函数,并编写主函数进行验证。
数据处理1.(1)(2)j结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。
(3)在Line类中添加两个数据成员。
2. #include <iostream>#include <cmath>using namespace std;#define PI 3.14159class Point{friend class Line;protected:double x, y ;public:Point(){x = 0 ; y = 0 ; }Point(double xv,double yv){ x = xv; y = yv; }double Area(){return 0;}void Show() {cout<<"x="<<x<<' '<<"y="<<y<<endl;}};class Circle :public Point{protected:double radius;public:Circle(){ x = 0; y = 0; radius = 0; }Circle(double xv,double yv,double vv):Point(xv,yv){ //调用基类构造函数radius = vv;}Circle(Circle & cir):Point(cir){ //按赋值兼容规则cir可为Point实参radius=cir.radius;}Circle & operator=(Circle & cir){this->Point::operator=(cir); //在派生类中定义重载的拷贝赋值操作符有固定的标准格式radius=cir.radius;return *this;}double Area(){return PI*radius*radius;}void Show()cout<<"x="<<x<<' '<<"y="<<y<<" radius="<<radius<<endl; //访问基类的数据成员}};class Cylinder:public Circle {double high;public:Cylinder(){ x = 0; y = 0; radius = 0;high=0; }Cylinder(double xv,double yv,double vv,double kv):Circle(xv,yv,vv){ //调用基类构造函数high=kv;}Cylinder(Cylinder & cyl):Circle(cyl){ //按赋值兼容规则cyl可为Cylinder实参high=cyl.high;}Cylinder & operator=(Cylinder & cyl){this->Circle :: operator=(cyl); //在派生类中定义重载的拷贝赋值操作符有固定的标准格式high=cyl.high;return *this;}double ceArea(){return 2*PI*radius*high;}double quArea(){return ceArea()+2* Area();}double volume(){return Area()*high;}void Show(){cout<<"x="<<x<<' '<<"y="<<y<<' '<<"radius="<<radius<<' '<<"high="<<high<<endl; //访问基类的数据成员};class Line{Point start,end; //对象成员public:Line(){} //对象成员初始化Line(double xv1,double yv1,double xv2,double yv2) :start(xv1,yv1),end(xv2,yv2){ }double GetLength() {return sqrt((start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y));}double Area(){return 0;}void Show(){cout<<"start point:\n";start.Show();cout<<"end point:\n";end.Show();}};int main(){Point pt(0,0);Circle cl1(100,100,10),cl2(cl1),cl3;Cylinder h1(50,50,20,30),h2(h1),h3;Line ln1(0,0,100,100),ln2;cout<<"点面积:"<<pt.Area()<<endl;pt.Show();cout<<"cl1圆面积:"<<cl1.Area()<<endl;cl1.Show();cout<<"cl2圆面积:"<<cl2.Area()<<endl;cl2.Show();cl3=cl1;cout<<"cl3圆面积:"<<cl3.Area()<<endl;cl3.Show();cout<<"h1底面积:"<<h1.Area()<<endl;cout<<"h1侧面积:"<<h1.ceArea()<<endl;cout<<"h1全面积:"<<h1.quArea()<<endl;cout<<"h1体积:"<<h1.volume()<<endl;h1.Show();cout<<"h2底面积:"<<h2.Area()<<endl;cout<<"h2侧面积:"<<h2.ceArea()<<endl;cout<<"h2全面积:"<<h2.quArea()<<endl;cout<<"h2体积:"<<h2.volume()<<endl;h2.Show();h3=h1;cout<<"h3底面积:"<<h3.Area()<<endl;cout<<"h3侧面积:"<<h3.ceArea()<<endl;cout<<"h3全面积:"<<h3.quArea()<<endl;cout<<"h3体积:"<<h3.volume()<<endl;h3.Show();cout<<"线面积:"<<ln1. Area()<<'\t'<<"线长度:"<<ln1. GetLength()<<endl;ln1.Show();ln2.Show();return 0;}实验结论:通过这次实验,我对类的继承和派生,派生类构造函数初始化基类成员和对象成员的方法,以及赋值兼容原则有了更深的理解。
实验继承与派生
实验项目:继承与派生实验目的:1.学习定义和使用类的继承关系,定义派生类2.熟悉不同继承方式下对基类成员的访问控制实验任务:1.定义一个基类Animal,有私有整形成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗2.定义一个基类BaseClass,有整形成员变量Number,构造其派生类,观察其构造函数和析构函数的执行情况。
3.定义一个车类(vehicle)基类,有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(Seatnum)等属性。
,在继承和过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题变成试试看。
实验步骤:1.编写程序定义Animal,成员变量age定义为私有的。
构造其派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现错误提示:程序名lab5_1.cpp2.编写程序定义一个基类BaseClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。
程序名lab5_2.cpp3.用debug功能跟踪程序lab5_2.cpp的执行过程,观察基类和派生类的构造函数和析构函数的的执行过程。
4.编写程序定义车类(vehicle),由此派生出自行车(bicycle)类、汽车(motorcar),把vehicle设置为虚基类。
再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。
程序名lab5_3.cpp。
编译成功后把vehicle设置成非虚基类,在编译一次,此时系统报错,无法编译成功。
实验8继承与派生讲解
实验8 继承与派生一、实验目的1.理解继承的含义,掌握派生类的定义和实现方法。
2.理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地使用继承层次中的各种类成员。
3.理解保护成员在继承中的作用,能够在适当的时候使用保护成员以便派生类成员可以访问基类的部分非公开成员。
4.理解虚基类在类的继承层次中的作用,虚基类的引入对程序运行时的影响,能够对使用虚基类的简单程序写出程序结果。
二、知识要点1.继承继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类。
从已定义类产生新类的过程称为派生。
已存在的用来派生新类的类为基类,又称父类。
从已存在的类派生出的新类称为派生类,又称为子类。
如,从哺乳动物类派生出狗类,哺乳动物是父类,狗是子类;从汽车类派生出轿车类,汽车是父类,轿车是子类。
在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。
从一个基类派生的继承称为单继承,从多个基类派生的继承称为多继承。
2.派生类的定义格式(1)单继承的定义格式class<派生类名>:<继承方式><基类名>{<派生类新定义成员>};其中:基类名是已经定义类的名称。
派生类名是新定义的一个类的名字,它是从基类中派生的;派生类是按指定继承方式从基类派生的,继承方式常用的有如下3种:public 表示公有继承private 表示私有继承protected 表示保护继承在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构。
(2)多继承的定义格式class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,……{<派生类新定义成员>};其中继承方式1、继承方式2、……是3种继承方式public、private和protected之一。
多继承与单继承的主要区别从定义格式上看,主要是多继承的基类多于一个。
继承与派生实验报告
继承与派生实验报告继承与派生实验报告引言:继承与派生是面向对象编程中的重要概念,通过继承,一个类可以派生出子类,从而实现代码的复用和扩展。
本文将通过实验来探讨继承与派生的概念、原理和应用。
实验目的:1. 理解继承与派生的概念和原理;2. 掌握如何在编程语言中实现继承和派生;3. 熟悉继承与派生的应用场景。
实验步骤:1. 创建父类:首先,我们创建一个名为"Animal"的父类,该类具有属性和方法,例如"age"和"eat()"。
2. 创建子类:接下来,我们创建一个名为"Cat"的子类,该类继承自"Animal"类。
在子类中,我们可以重写父类的方法或添加新的方法。
3. 实例化对象:通过实例化父类和子类的对象,我们可以调用它们的方法和访问它们的属性。
4. 测试继承与派生:我们可以通过调用父类和子类的方法,观察它们的行为是否符合预期。
实验结果:在创建父类"Animal"时,我们定义了一个"age"属性和一个"eat()"方法。
在创建子类"Cat"时,我们继承了父类的属性和方法,并添加了一个新的"meow()"方法。
在实例化父类对象时,我们可以通过调用"eat()"方法来模拟动物进食的行为。
而在实例化子类对象时,我们既可以调用从父类继承而来的"eat()"方法,也可以调用子类特有的"meow()"方法来模拟猫咪的叫声。
通过实验,我们发现继承与派生的优势在于代码的复用和扩展。
我们只需在父类中定义一次通用的属性和方法,然后让不同的子类继承父类,即可实现代码的复用。
同时,子类还可以通过重写父类的方法或添加新的方法,实现代码的扩展和个性化。
讨论与应用:继承与派生不仅仅局限于上述的父类和子类关系,它还可以在多层次的继承结构中发挥作用。
C++继承与派生实验报告
C++继承与派生实验报告应用数学学院信息与计算科学(信息计算)专业1 班、学号3111008106姓名吴伟栓教师评定_________________实验题目继承与派生一、实验目的与任务实验目的:(1)学习声明和使用类的继承关系,声明派生类。
(2)熟悉不同继承方式下对基类成员的访问控制。
(3)学习利用虚基类解决二义性问题。
实验任务:(1)声明一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。
(2)声明一个基类BaseClass,有整形成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
(3)声明一个车(vehicle)基类,具有MaxSpeed,Weight等成员变量,Run,Stop 等成员函数,由此派生出自行车(bicycle)类,汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。
从bicycle 和motorcar派生出摩托车(motocycle)类,在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?编程试试看。
(4)(选做)从实验六中的people(人员)类派生出student(学生)类,添加属性:班号char classNo[7];从people类派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。
从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacherradviser;从graduate类和teacher 类派生出TA(助教生)类,注意虚基类的使用。
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++]继承和派生实验报告
运行结果:修改过后的程序代码如下:#include <iostream>#include <cstring>using namespace std;class Person{private: char m_strName[20];int m_nAge;int m_nSex;public: Person();//构造函数Person( char *name, int age, char sex ); //构造函数Person( const Person &p ); //拷贝构造函数~Person() //析构函数{cout<<"Now destroying the instance of Person"<<endl;}void SetName( char *name );void SetAge( int age );void setSex( char sex );char* GetName();运行结果:2. 程序的类结构图为:A-x:int+A()+A( int m ) : x( m )+~A()B-A a-y:int+B()+B( int m, int n, int l ) : A( m ), a( n ),y( l )+~B()运行结果:3.程序的类结构图为:Person#m_name[20]:char#m_age:int#m_sex:char+Person()+information(char* name,int age,char sex):void+~Person()Teacher#major[20]: char#position[20]: char#course[20]: char+m_major(char* m): void+m_position(char* p):void+m_course(char* c): voidcout<<'['<<x_size<<","<<y_size<<']'<<", "<<'['<<i_size<<","<<j_size<<']'; }int main(){Circle1 circle(0.0,0.0,3.0);circle.area();circle.perimeter();circle.print();cout<<"\n";Square1 square(0.0,0.0,3.0,3.0);square.area();square.perimeter();square.print();cout<<"\n";cout<<"圆的面积为:"<<circle.area()<<endl;cout<<"圆的周长为:"<<circle.perimeter()<<endl;cout<<"圆的圆心坐标和半径为:";circle.print();cout<<"\n\n";cout<<"正方形的面积为:"<<square.area()<<endl;cout<<"正方形的周长为:"<<square.perimeter()<<endl;cout<<"正方形的中心坐标和一个顶点坐标分别为:";square.print();cout<<"\n";return 0;}运行结果:。
C++实验报告--继承和派生
}
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语言中继承与派生的原理和应用。
实验目的: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,我们可以看到其对程序运行结果的影响。
这种灵活性,使得我们可以根据具体需求,定制不同的派生类,实现更加个性化的功能。
继承与派生
实验4 继承与派生班级学号(最后两位)姓名成绩一、实验目的1.熟练掌握类的继承,能够定义和使用类的继承关系2.掌握派生类的声明与实现方法3.掌握类构造函数的初始化列表与作用域分辨率的使用方法4.理解虚基类在解决二义性问题中的作用.二、实验内容1.定义一个基类有姓名、性别、年龄,再由基类派生出教师类和学生类,教师类增加工号、职称和工资,学生类增加学号、班级、专业和入学成绩。
2.声明一个哺乳动物Mammal类,再由此派生出狗Dog类,声明一个Dog类的对象,观察基类与派生类的构造函数与析构函数的调用顺序。
3.定义一个Point类,派生出矩形类Rectangle和圆类Circle,计算各派生类对象的面积Area()。
4.设计一个圆类circle和一个桌子类table,另设计一个圆桌类roundtable,它是从前两个类派生的,要求输出一个圆桌的高度、面积和颜色等数据。
5.定义一个大学生类student,函数私有数据成员:姓名、学号、校名,并为它定义带参数的构造函数,参数带缺省值的构造函数和输出数据成员值的print()公有成员函数,另定义研究生类,它以公有继承方式派生于类student,新增加“研究方向、导师名”两个私有数据成员,并定义带参数的构造函数和输出研究生数据的print()公有成员函数。
在main()函数中定义基类和派生类对象,对类进行测试。
三、实验源程序、测试与结论1.#include<iostream>#include<string>using namespace std;class person{public:person(string name_,char sex_,int age_):name(name_),sex(sex_),age(age_){}void show(){cout<<"name: "<<name<<endl;cout<<"sex: "<<sex<<endl;cout<<"age: "<<age<<endl;}protected:string name;char sex;int age;};class teacher:public person{public:teacher(string name_,char sex_,int age_,int j_n,string job_,int wage_):person(name_,sex_,age_),job_number(j_n),job(job_),wage(wage_){}void show1();private:int job_number;string job;int wage;};void teacher::show1(){cout<<"This teacher is: "<<endl;show();cout<<"job number: "<<job_number<<endl;cout<<"job: "<<job<<endl;cout<<"wage: "<<wage<<endl;}class student:public person{public:student(string name_, char sex_, int age_, int num_, string cla_, string major_, int score_): person(name_,sex_,age_), num(num_), cla(cla_), major(major_), score(score_){}void show2();private:int num;string cla;string major;int score;};void student::show2(){cout<<"This student is: "<<endl;show();cout<<"NO: "<<num<<endl;cout<<"class: "<<cla<<endl;cout<<"major: "<<major<<endl;cout<<"score: "<<score<<endl;}void main(){teacher t("John",'M',28,11111,"math",5000);t.show1();student s("Randy",'M',20,1210034,"BX1205","electron",100);s.show2();}2.#include<iostream>using namespace std;class Mammal{public:Mammal(){cout<<"Constructor Mammal"<<endl;}~Mammal(){cout<<"Mammal will die"<<endl;}};class Dog:public Mammal{public:Dog():Mammal(){cout<<"Constructor Dog"<<endl;}~Dog(){cout<<"Dog will die"<<endl;}};void main(){Dog dog;}3.#include<iostream>#include<math.h>using namespace std;#define PI 3.14class Point{public:Point(float x_=0, float y_=0):x(x_),y(y_){} protected:float x;float y;};class Rectangle:public Point{public:Rectangle(float x_, float y_):Point(x_,y_){}void Area();};void Rectangle::Area(){float area;area=x*y;cout<<"矩形的面积为: "<<area<<endl; }class Circle:public Point{public:Circle(float r_):Point(),r(r_){}void Area();private:float r;};void Circle::Area(){float area;area=PI*r*r;cout<<"圆的面积为: "<<area<<endl; }void main(){float l,w,r;cout<<"请输入长方形的长和宽: ";cin>>l>>w;cout<<"请输入圆的半径: ";cin>>r;Rectangle rectangle(l,w);rectangle.Area();Circle circle(r);circle.Area();}4.#include<iostream>using namespace std;#include<string>#define PI 3.14class circle{public:circle(float r_=0):r(r_){}void Area(){float area;area=PI*r*r;cout<<"圆的面积为: "<<area<<endl;}protected:float r;};class table{public:table(float h_, string color_):h(h_),color(color_){}void show(){cout<<"桌子的高度: "<<h<<'\n'<<"桌子颜色: "<<color<<'\n';}protected:float h;string color;};class roundtable:public circle,public table{public:roundtable(float r_, float h_, string color_):circle(r_),table(h_,color_) {cout<<"这是一个圆桌,它具体属性有: "<<endl;}};void main(){float r, h;string color;cout<<"请输入圆的半径: ";cin>>r;cout<<"请输入桌子的高度和颜色: ";cin>>h>>color;roundtable t(r,h,color);t.show();t.Area();}5.#include<iostream>using namespace std;#include<string>class student{private:string name, school;int no;public:student(string name_,int no_,string school_):name(name_),no(no_),school(school_){} student(){name="John";no=121003400;school="Shanghai University";}void print(){cout<<"大学生的信息如下: "<<endl;cout<<"姓名: "<<name<<endl;cout<<"学号: "<<no<<endl;cout<<"校名: "<<school<<endl;}};class graduate:public student{private:string direction,teacher;public:graduate(string name_,int no_,string school_,string direction_,string teacher_):student(name_,no_,school_),direction(direction_),teacher(teacher_){}void print(){cout<<"研究生的信息如下: "<<endl;cout<<"研究方向: "<<direction<<endl;cout<<"导师: "<<teacher<<endl;}};void main(){student s1;s1.print();student s2("Ranen", 121003411, "SDJU");s2.print();graduate s3("Cachy",121003422, "SDJU","Math","Tom");s3.student::print();s3.print();}。
继承与派生实验报告
用来记录对象的性别、age用来记录对象年龄、add用来记录对象的家庭住址;包括函数成
员printinfor()用来输出对象的个人信息。
要求:
(1)构造Worker类对象输出该对象的工号、年龄、家庭住址等信息。
b.PrintInfo();
return 0;
}
【实验结果与数据处理】
【实验结论】
(2)在Worker类的printinfor()成员函数中须调用Person类的成员函数PrintName()。
输出结果如:丁一10127男28合肥市长江路369号
分析:注意选择派生类对基类的继承方式。
【实验器材】
微型计算机、Visual C++ 6.0集成软件平台
【实验步骤】
1.编辑源程序。
2.对源程序进行编译并调试程序。
继承与派生实验报告
实验题目
继承与派生
日期
班级
组别
姓名
类型
【实验目的】
1.学会从现有类派生出新类的方式。
2.了解基类成员在派生类中的访问控制。
3.熟悉派生类中构造函数和析构函数的调用顺序。
4.掌握虚基类所要解决的问题。
【实验原理】
定义一个Person类,数据成员包含能够保存姓名的变量name,其中有能够输出姓名的成员函数PrintName()。
};Biblioteka class Worker:public Person
{
public:
Worker(char * n,int nu,char * s,int ag,char *add):Person(n)
继承与派生实验报告
b,float
int main() { teacher1 q(50); teacher2 w(70);
student2 e(75,82,100); student3 r(78,79,87); zhuyan t(80,70,78,81); system("pause"); return 0; } 内容2: #include <iostream> using namespace std; class employee {public: employee() {cout<<"编号:";cin>>number; cout<<"姓名:";cin>>name; salary=0;} protected: char number[5]; char name[10]; double salary; }; class manager:public employee {public: manager(){monthlypay=8000;salary=monthlypay;} void print() {cout<<"经理:"<<name<<"编号:"<<number<<"本月工资:" <<salary<<endl;} protected: int monthlypay; }; class technician:public employee {public: technician(){weekpay=100;} void pay() {cout<<name<<"工作时间:";
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验8 继承与派生一、实验目的1.理解继承的含义,掌握派生类的定义和实现方法。
2.理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地使用继承层次中的各种类成员。
3.理解保护成员在继承中的作用,能够在适当的时候使用保护成员以便派生类成员可以访问基类的部分非公开成员。
4.理解虚基类在类的继承层次中的作用,虚基类的引入对程序运行时的影响,能够对使用虚基类的简单程序写出程序结果。
二、知识要点1.继承继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类。
从已定义类产生新类的过程称为派生。
已存在的用来派生新类的类为基类,又称父类。
从已存在的类派生出的新类称为派生类,又称为子类。
如,从哺乳动物类派生出狗类,哺乳动物是父类,狗是子类;从汽车类派生出轿车类,汽车是父类,轿车是子类。
在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。
从一个基类派生的继承称为单继承,从多个基类派生的继承称为多继承。
2.派生类的定义格式(1)单继承的定义格式class<派生类名>:<继承方式><基类名>{<派生类新定义成员>};其中:基类名是已经定义类的名称。
派生类名是新定义的一个类的名字,它是从基类中派生的;派生类是按指定继承方式从基类派生的,继承方式常用的有如下3种:public 表示公有继承private 表示私有继承protected 表示保护继承在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构。
(2)多继承的定义格式class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,……{<派生类新定义成员>};其中继承方式1、继承方式2、……是3种继承方式public、private和protected之一。
多继承与单继承的主要区别从定义格式上看,主要是多继承的基类多于一个。
3.派生类的3种继承方式由下表来理解3种继承方式的各自特点。
基类基类内部函数基类对象private继承方式protected继承方式public继承方式派生类内部函数派生类对象派生类内部函数派生类对象派生类内部函数派生类对象private成员可访问不可访问不可访问不可访问不可访问不可访问不可访问不可访问protected成员可访问不可访问可访问,转为private不可访问可访问,转为protected不可访问可访问,保持protected不可访问public成员可访问可访问可访问,转为private不可访问可访问,转为protected不可访问可访问,保持public可访问4.派生类和基类的关系任何一个类都可以派生出很多个新类,派生类也可以再派生出新类,因此,基类和派生类是相对而言的。
一个基类可以是另一个基类的派生类,这样便形成了复杂的继承结构,出现了类的层次。
一个基类派生出一个派生类,它又做另一个派生类的基类,则原来基类为该派生类的间接基类。
基类和派生类之间的关系可以有以下3种描述。
(1)派生类是基类的具体化类的层次通常反映了客观世界中某种真实的模型。
基类是对若干个派生类的抽象,而派生类是基类的具体化。
基类抽取了它的派生类的公共性,而派生类通过增加行为将抽象类变为某种有用的类型。
(2)派生类是基类定义的延续先定义一个抽象基类,该基类中有些操作并未实现,然后定义非抽象的派生类,实现抽象基类中定义的操作。
例如虚函数就属于此类情况。
这时派生类是抽象的基类的实现,既可以看成是基类定义的延续,这也是派生类的一种常用方法。
(3)派生类是基类的组合。
在多重继承时,一个派生类有多于一个的基类,这时派生类将是所有基类行为的组合。
5.虚基类的引入和说明引进虚基类的真正目的是为了解决二义性的问题。
声明虚基类的方法是:在定义虚基类的直接派生类时,用关键字virtual引出基类名。
6.二义性问题一般来说,在派生类中对基类成员的访问应该是唯一的,但是由于多继承情况下,可能造成对基类中某个成员的访问出现不唯一的情况,则称为对基类成员访问的二义性问题。
由多重继承引起的二义性问题是指:当一个派生类从多个基类派生,而这些基类又有一个共同的基类,则对该基类中说明的成员进行访问时,可能会出现二义性。
7.派生类构造函数和析构函数(1)派生类的对象的数据成员是由基类中说明的数据成员和派生类中说明的数据成员共同构成。
将派生类的对象中由基类说明的数据成员和操作所构成的封装体称为基类子对象,它由基类中的构造函数进行初始化。
(2)构造函数不能够被继承,因此派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。
所以在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化,如果派生类中还有子对象时,还应该包含对子对象初始化的构造函数。
(3)派生类构造函数的一般格式如下(派生类名)(<派生类构造函数总参数表>):<基类构造函数>(<参数表1>),<子对象名>(<参数表2>){<派生类中数据成员初始化>}(4)派生类构造函数的调用顺序如下:基类的构造函数-->子对象类的构造函数-->派生类的构造函数(5)当对象被删除时,派生类的析构函数被执行。
由于析构函数不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。
执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执行构造函数时的顺序正好相反。
(6)派生类构造函数使用中应注意的问题:派生类构造函数的定义中可以省略对基类构造函数的调用,其条件是在基类中必须有默认的构造函数或者根本没有定义构造函数。
当然,如果基类中没有定义构造函数,那么派生类根本不必负责调用基类构造函数。
当基类的构造函数使用一个或多个参数时,则派生类必须定义构造函数,提供将参数传递给基类构造函数的途径。
在某些情况下,派生类构造函数的函数体可能为空,仅起到参数传递作用。
三、实验内容和步骤1.定义和使用类的继承关系与定义派生类【实例1】编写一个学生和教师数据输入和显示程序,学生数据有编号、姓名、班级和成绩,教师数据有编号、姓名、职称和部门。
要求将编号、姓名的输入和显示设计成一个类Person,并作为学生数据操作类Student和教师数据操作类Teacher的基类。
题目分析:由题目可以得出需要设计一个Person基类,Teacher类和Student类都是由Person类派生的,即Teacher类和Student类都是由Person类继承而来,并且Teacher类和Student 类都有编号和姓名数据成员,可以把它们作为Person类的公有或保护数据成员。
程序示例:#include<iostream.h>class Person{protected:char name[10];int number;public:void input(){ cin>>name>>number;}void show(){ cout<<name<<"\t"<<number<<endl;}};class Student :public Person{char sclass[10];float score;};class Teacher :public Person{char dept[10];char title[6];};void main(){Student s1;Teacher t1;cout<<"Please input the name and the number of a student:"<<endl;s1.input();s1.show();cout<<"Please input the name and the number of a teacher:"<<endl;t1.input();t1.show();}注意:把input和show两个函数放在Person类中。
实验要求:1)上机运行该程序。
2)为Teacher类编写系别和职称的输入/输出函数;为Student类编写班级和成绩的输入/输出函数。
2.熟悉不同方式下对基类成员的访问控制【实例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 show(){ 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 show(){ cout<<x<<","<<y<<endl;}void fun(){ move(3,5);}void f1(){ A::show();}private:int x,y;};void main(){A a(1,2);a.show();B b(3,4,5,6);b.fun();b.show();b.f1();}运行结果:(1,2)(5,6)(6,9)注意:(1)类A和类B中的数据成员都是私有属性,故对它们的访问只能通过成员函数。
(2)注意对象的初始化方法。
实验要求:上机运行程序,并修改已知数据,分析结果。
【实例3】指出下面程序的错误并改正之。
#include<iostream.h>class Point{ int x,y;public:Point (int xx,int yy){ x=xx;y=yy;}void add(int xa,int ya){ x+=xa;y+=ya;}void show(){ cout<<"x="<<x<<","<<"y="<<y<<endl;}};class Rect:private Point{ int len,width;public:Rect (int x,int y,int ll,int ww) : Point (x,y){len=ll;width=ww;}void showRect(){ show();cout<<"length="<<len<<","<<"width="<<width<<endl;}};void main(){ Rect rect(0,2,3,6);rect.add(4,5);rect.showRect();}题目分析:一个类被私有继承之后,其成员在派生类中访问属性会变为private,因而在派生类的对象rect不能直接访问基类的成员函数add。