文档库 最新最全的文档下载
当前位置:文档库 › 实验五类的继承与派生

实验五类的继承与派生

实验五类的继承与派生
实验五类的继承与派生

第一节类的继承与派生

一、基本概念

继承是面向对象程序设计的一个特性,所谓继承就是在已有类的基础上创建新的类,新类可以从一个或多个已有类中继承成员函数或数据成员,而且新类还可以重新定义或加进新的数据和函数。其中,已有类称为基类或父类,新类称为派生类或子类。

在现实世界中许多事物都具有继承性。例如:“汽车”这个类中包括了许多类型,有运输汽车、专用汽车;运输汽车中又包括客车、货车…….;专用汽车中又包括巡逻车、消防车、救护车……..;所有这些类型的车都具有汽车的共同特性即都有发动机、车身、轮胎等共性,还都是自行驱动的。

而客车和货车又有所不同,客车用来载客,货车用来拉货,它们有自己不同于其它车的特性,这就是继承。我们把汽车称为基类,把运输汽车、客车、货车称为派生类。通过继承,派生类不仅拥有了基类的属性和行为,而且具有不同于它类的自己的特点。

二、派生类的定义与构成

当你去水果店买水果的时候,你经常会发现很多同类水果又有了新的品种。比如,“李子”既小又涩,嫁接在梨树上后长出来的李子却硕大、香甜、清脆,比没有嫁接的李子好吃,但它还是李子家族中的一员;所以,可以认为“嫁接李子”是从“李子”中派生出来的。当然,可以把“李子”嫁接在梨树上,也可以嫁接在苹果树上,结出来的都是“李子”,但是各自味道不同。

所谓派生就是从已有类中产生一个新的子类。

基类就是已存在的可以派生新类的类,如下图中的A、D、E都是基类。

派生类就是由基类派生出来的新类,如下图中的B、C、F都是派生类。

1. 单继承派生类的定义格式

class <派生类名> : <继承方式> <基类名>

{

派生类成员的定义;

};

其中,“派生类名”是新定义的一个类的名字,它是从“基类名”中派生的,并且按指定的“继承方式”派生。

例如:

class peach 多继承派生类的定义格式

class <派生类名> :<继承方式1> <基类名>,<继承方式2> <基类名>, …….

{

派生类成员的定义;

};

多继承与单继承在定义格式的区别仅在于它们的基类个数不同,单继承的基类只有一个,而多继承的基类有多个,相邻两个基类之间用逗号间隔,每个基类名前都应有一个该基类的继承方式的说明符。

例如:

class peach //定义基类:peach

{

datatype color , shape ;

};

class apple //定义基类:peach

{

datatype color, shape , weight ;

};

class sweetpeach : public peach, public apple // 多继承

{

datatype color, shape, taste;

};

类sweetpeach 同时继承自类peach 和类apple,这就是多继承。

3.继承的作用

有的读者可能会问为什么要有继承,继承有什么好处,继承的作用是什么

为了解决这些疑问,我们一起来分析以下例子,从中领悟继承的奥妙。

【例10-1-1】分析以下代码。声明一个person 类,它包含的成员有name(姓名)、age (年龄)、gender(性别),和output函数,具体定义如下:

class person

{

public :

char name[8] ;

int age;

char gender ;

public :

void output() { }

};

现在要声明一个student类,它包含的成员有name(姓名),age(年龄),gender(性别),department(系),stuno(学号),address(住址),和output函数,具体定义如下:

class student

{

public :

char name[8] ;

int age;

char gender;

char department[20] ;

int stuno;

int address;

public :

void output() { }

};

从这两个类的声明中可以看出,它们中有些成员数据和成员函数是相同的。这样就存在代码的重复,为了提高代码的可重用性,就引入了继承。即,如果student类以共有继承的方式继承person类,那么student类就可以直接使用person类中的共有成员如name, gander,age和output() 函数,这样在student类中就不需要再定义与person类中相同的变量了,只定义person类中没有的在student类中需要的变量。具体实现如下:class student : public person // student共有继承person类

{

public :

char department[20] ;

int stuno ;

int address ;

public :

void output() { }

};

提示

student 类称为派生类,person类成为基类;

关键字public 的作用是说明派生类公有继承了基类中的所有成员,即派生类可以直接访问基类的成员;

继承可以使代码得以重用,提高工作效率。

三、派生类访问基类成员

通过前面的学习大家都知道基类的成员有public(公有)、protected(保护)、private(私有)3种访问属性,基类的自身成员可以对基类中任何一个其他成员进行访问,但是通过基类的对象就只能访问该类的公有成员。

派生类可以继承基类中除了构造函数和析构函数之外的全部成员,但是这些成员的访问属性在派生过程中是可以调整的。从基类继承来的成员在派生类中的访问属性是由继承方式控制的。不同的继承方式导致原来具有不同的访问属性的基类成员在派生类的访问属性也有所不同。

在派生类中,从基类继承来的成员可以访问属性有4种:不可直接访问的成员、public (公有成员)、protected(保护成员)、private(私有成员)。

1.三种继承方式的声明

public 公有继承

公有继承:在定义一个派生类时将基类的继承方式指定为public 的继承方式。

例如:class student : public person { }

private 私有继承

私有继承:在定义一个派生类时将基类的继承方式指定为private的继承方式。

例如:class student : private person { }

protected 保护继承

保护继承:在定义一个派生类时将基类的继承方式指定为protected的继承方式。

例如:class student : protected person { }

2.三种继承方式的区别

如表1指明了三种继承方式的区别,即派生类对基类成员的访问能力。

表 1 三种继承方式的区别

在基类中的访问属性继承方式在派生类中的访问属性

private public不可直接访问

private private不可直接访问

private protected不可直接访问

public public public

public private private

public protected protected

protected public protected

protected private private

protected protected protected

提示

在任何继承方式中基类中的私有成员都不允许派生类继承,即在派生类中是不可直接访问基类中的私有成员。

当类的继承方式为公有继承时:基类中的所有公有成员在派生类中仍为公有成员;基类中的所有保护成员在派生类中仍为保护成员。

当类的继承方式为私有继承时:基类中的所有公有成员在派生类中都为私有成员;基类中的所有保护成员在派生类中都为私有成员。

当类的继承方式为保护继承时:基类中的所有公有成员在派生类中都为保护成员;基类中的所有保护成员在派生类中仍为保护成员。

派生类对基类成员的访问形式主要有以下两种:

(1) 内部访问:由派生类中的新增成员对从基类继承来的成员的访问。

(2) 对象访问:在派生类外部,通过派生类的对象对从基类继承的成员的访问。

现在分别讨论在公有继承、私有继承、保护继承这3种继承方式下,派生类对基类成员的访问规则。

一、公有继承

【例1】分析以下程序。

源代码:

#include <>

#include <>

class Base

{

private:

int pvx; //pvx为基类私有变量

protected :

int pty; //pty为基类保护变量

public :

float puf; //puf为基类公有变量

void Setxy(int q, int u, float w) //Setxy()为基类公有函数

{

pvx = q ; pty = u; puf = w;

}

void Output() //Output()为基类公有函数

{

cout << "class Base output "<< endl;

cout << "pvx= " << pvx << endl;

cout << "pty= " << pty << endl;

cout << "puf= " << puf << endl;

}

};

class Derive : public Base //公有单继承

{

private :

float pvz;

public :

void Setvalue(int x, int y, float f, float z)

{

Setxy(x, y, f);

pvx = x; //非法访问,基类中的pvx为private属性,不能被继承

pty = y; //合法访问

puf = f; //合法访问

pvz = z;

}

void Print()

{

cout << "pvx= " << pvx << endl;// 非法访问,在基类中pvx为私有成员

cout << "class Derive output " << endl;

cout << "pty= "<

}

运行输出:

class Base output

pvx= 3

pty= 5

puf=

class Derive output

pty= 5

puf=

pvz=

puf=

【简要分析】

①“class Derive : public Base { }”表明这是一个公有继承的例子,基类Base中有3个变量和两个函数:私有变量pvx、保护变量pty、公有变量puf和公有函数Setxy()、Output()。

其中:被Derive派生类继承后,pvx在派生类中不能直接访问,只能通过Base中具有public属性的函数对其间接访问;pty被Derive派生类继承之后仍为protected属性,派生类成员可以直接访问;puf、Setxy()、Output()这3个具有public属性成员被Derive派生类继承后,仍为public属性,派生类成员可以对其直接访问。

②输出的前4行:调用“();”的输出结果。

输出的后4行:调用“();”的输出结果。

最后1行:调用“cout << "puf= " << << endl;”的输出结果。

结论:在公有继承中,无论是派生类中的成员还是派生类对象都不能直接访问基类中的private成员;派生类的成员可以访问继承来的protected成员和public成员;但是,类的外部使用者只能通过派生类的对象访问继承来的public成员,不能访问继承于基类的private 和protected成员。

二、私有继承

【例2】任务1:分析以下程序。

a)找出非法语句并在程序中注释非法的原因。

b)写出删除非法语句后程序的运行结果。

源代码:

#include <>

#include <>

class Base

{

private:

int pvx;

protected:

int ptf;

public :

void Setxf(int w, int f)

{

pvx = w; ptf = f;

}

void Print()

{

cout << "pvx= " << pvx << endl;

cout << "ptf= " << ptf << endl;

}

};

class Derive:private Base //私有继承

{

private:

double pvy ;

protected:

double ptz;

public:

int pd;

void Setvalue(int a, int b, double c, double d)

{

pvx = a;

ptf = b + 6;

Setxf(a, b);

pvy = c;

ptz = d;

pd = 90;

}

void Output()

{

cout << "pvx= " << pvx << endl;

Print();

cout << "pvy= " << pvy << endl;

cout << "ptz= " << ptz << endl;

}

};

void main()

{

Derive obj;

(1, 6, , ;

();

(101, 87);

cout << "pvx= " << << endl;

cout << "pvy= " << << endl;

cout << "ptz= "<< << endl;

= 68;

cout << "pd= " << << endl;

system("pause");

}

【简要分析】

“class Derive :private Base{ }”表明这是一个私有继承,Base基类中有3个变量和两个函数:私有pvx、保护ptf、公有函数Setxf()、公有函数Print()。

基类Base被私有继承之后,其protected成员在派生类中不能直接访问;而protected 成员和public成员都成了派生类的私有成员,只有派生类的成员才能直接访问;派生类对象也不能直接访问继承自Base的protected成员和public成员。

结论:私有继承中,基类中的protected、public成员都成为派生类中的private成员,派生类成员不能直接访问基类中的private成员,而派生类中的成员可以直接访问基类中的protected、public属性的成员;派生类对象不能直接访问基类中的任何成员。

三、保护继承

【例3】任务2:分析以下程序。

a)找出非法语句并在程序中注释非法的原因。

b)写出删除非法语句后程序的运行结果。

源代码:

#include <>

#include <>

class Base

{

private:

int pvx;

protected:

int pty;

public:

int puz;

void setx(int a)

{

pvx = a;

}

int getx()

{

return pvx;

}

};

class Derive:protected Base // 保护继承

{

private:

int pva;

protected:

int ptb;

public:

int puc;

void setvalue(int a, int b, int c, int d, int e, int f)

{

pvx = a;

setx(a);

pty = b;

puz = c;

pva = d;

ptb = e;

puc = f;

}

void print()

{

cout << "pvx= " << pvx << endl;

cout << "pty= " << pty << endl;

cout << "puz= " << puz << endl;

cout << "pva= " << pva << endl;

cout << "ptb= " << ptb << endl;

cout << "puc= " << puc << endl;

}

};

void main()

{

Derive obj;

(9, 8, 7, 6, 5, 4);

();

cout << "puc= " << << endl;

system("pause");

}

结论:保护继承中,基类中的protected、public成员都成为派生类中的protected成员,

派生类成员不能直接访问基类中的private成员,而派生类中的成员可以直接访问基类中的protected、public属性的成员;派生类对象均不能直接访问基类中的任何成员。

【例4】任务3:分析以下程序。找出非法语句并在程序中注释非法的原因。

分析以下代码。

源代码:

#include

using namespace std;

class person

{

public :

char name[8];

char gender;

void show()

{ cout<< name <<" " << gender <<" " <

private:

int age;

protected:

char address[20];

};

class teacher : public person //公有继承

{

private :

char tecpost[8] ;

char department[20];

public:

void putout()

{

cout << name << " " << address << endl;

cout << age << endl;

cout << department << " " << tecpost << endl;

}

};

class student : protected person //保护继承{

public:

char stuno[15];

char school[20];

void putout()

{

cout<

cout<

cout<

}

};

class doctor : private person //私有继承{

public:

char tel[13];

char position[15];

void putout()

{

cout<

cout<

cout<

}

};

void main()

{

teacher a;

student b;

doctor c;

cout<<<

cout<<<

cout<<<<" "<<<

cout<<<

cout<<<<" "<<<<" "<<<

cout<<<<" "<<<<" "<<<

继承和派生实验报告

实验目的与要求: 1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。 2.掌握派生类构造函数初始化基类成员和对象成员的方法。 3.掌握内联函数和默认函数。 4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。 实验过程及内容: 1.实践教程实验二十二P81范例:定义一个继承与派生关系的类体系,在 派生类中访问基类成员。 ①先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员; ②以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数; ③定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。 编程测试所定义的类体系。 本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。2. 实践教程P83编程:多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。要求计算圆柱的底面积、侧面积、全面积和体积。 请编写所有完整的成员函数,并编写主函数进行验证。 数据处理 1. (1)

(2)j结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。(3)在Line类中添加两个数据成员。

2. #include #include using namespace std; #define PI 3.14159 class 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="<

注意派生类的构造函数中对基类数据成员的初始化方法(即 Circle(double xv,double yv,double vv):Point(xv,yv)), 以及构造函数中对对象成员的初始化方法(即 Line(double xv1,double yv1,double xv2,double yv2) : start(xv1,yv1),end(xv2,yv2){ } ) 【要求】 (1)建立工程,录入上述程序,改变数据实验之。 (2)修改Point 类的数据成员x ,y 的访问权限为private ,再运行,结果如何? (3)如果不将Line 类设为 Point 类的友元,应采取什么措施?为哪个类增加数据或函数成员? 2.编程:多层派生练习,由上题Point 类和Circle 类继续派生出Cylinder 类。要求计算圆柱体的底面积、侧面积、全面积和体积。

c++派生类与继承实验报告材料

实验2 派生类与继承 实验课程名:面向对象程序设计(C++) 专业班级:学号:姓名: 实验时间:实验地点:指导教师: 2.1实验目的和要求 (1) 掌握派生类的声明方法和派生类构造函数的定义方法。 (2) 掌握不同继承方式下,基类成员在派生类中的访问属性。 (3) 掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。 (4) 学习虚基类在解决二义性问题中的作用。

二、实验内容 一、构造一个类Geometry 及其派生类,该类主要实现关于几何图形的基本操作。对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。 试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。 实验代码如下: #include using namespace std; class Geometry { public: Geometry(){} Circle radiums Circle() ~Circle() Ball Ball() ~Ball() Geometry Geometry() ~Geometry() GetArea() GetPerimeter() Getcolume() show() Column Column() ~Column() Rectangle Rectangle() ~Rectangle()

~Geometry(){} double GetArea(){}//求面积函数double GetPerimeter(){}//求体积函数double Getcolume(){}//求周长函数 virtual show(){} }; class Circle:public Geometry { public: Circle(double i) { radiums=i; } ~Circle(){} double GetArea(); double Getcolume(); double R() { return radiums; } show(); private:

实验6-继承与派生(1)

实验六继承与派生(1) 1.1 实验目的 (1)理解继承的含义以及声明; (2)理解共有派生、私有派生和保护派生的含义以及使用; (3)理解单派生类中构造函数和析构函数的调用顺序。 1.2 实验内容 1、定义点CPoint类作为基类,在此基础上派生出直线CLine类和圆CCircle类,并要求基类和各派生类具有以下特点: (1)CLine类含有计算直线长度和斜率的成员函数; (2)CCircle类含有计算圆面积的成员函数。 2、程序阅读。 (1)以下程序有两大错误,请修改程序,写出程序运行结果并分析。 #include using namespace std; class CBase { public: CBase(int a):a(a) {} protected: void print() { cout<<"a="<

public: void print() { CBase::print(); cout<<"b="< using namespace std; class CBase {public: CBase(int a):a(a) {cout<<"base structure"< 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)

c++实验报告

面向对象程序设计 (C++) 实 验 报 告 指导老师:柯栋梁 学生:吴健 班级:软131 学号:139074164

目录 实验一、VC6.0环境入门与简单程序设计实验报告 (3) 实验二、函数的应用实验报告 (7) 实验三、类与对象实验报告 (14) 实验四、C++程序结构实验报告 (22) 实验五、数组、指针与字符串实验报告 (26) 实验六、继承和派生实验报告 (33) 实验七、多态性实验报告 (42) 实验八、面向对象综合实验实验报告 (48)

实验一、VC6.0环境入门与简单程序设计实验报告 系软件工程班级 131 学号 139074164 姓名吴健 同组者指导教师柯栋梁 一、实验目的: 1、熟悉VC++6.0开了环境并编写简单的C++程序。 3、使用C++语言编写简单的输入输出程序。 4、使用VC++6.0的DEBUG调试功能:单步执行、设置断点、观察变量值。 二、实验内容: 1、使用VC++建立一个标准C++程序,编译、运行如下程序: #include Int main() { Cout<<”Hello World!\n”; Cout<<”Welcome to C++!\n”; } 2、编程计算图形的面积。程序可计算圆形、长方形、正方形等的面积,运行时首先提示用户选择图形类型,然后根据不同图形类型,输入相关参数计算其面积,并将其显示出来。 3、使用DEBUG功能观察任务2程序运行中变量值的变化情况。 三、实验要求: 1、任务1要求熟悉VC++开发环境,并能够使用其建立第一个C++程序。 2、实验前要做好充分准备,包括程序清单、调试步骤、调试方法,以及对程序结果的分析等。 四、实验报告: 1.程序运行截图

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

实验二继承与派生——教师工资计算(一) 一、实验目的 1.理解继承的含义; 2.学习从现有类派生出新类的方式; 3.了解在派生类中如何使用基类的成员。 二、实验内容与要求 1.新建一个雇员类,它的数据成员有雇员代号,年龄,工资,性别,姓名,输入雇员资料方法,打印雇员资料方法。 2.以此雇员类为基类,从中派生出教师类,其中要求在教师类中加入一个计算教师工资的方法,教师工资=基本工资(1000)+课时(月工作量)×30。 3.以此雇员类为基类,从中派生出实验员类,其中要求在实验员类中加入一个计算实验员工资的方法,实验员工资=基本工资(800)+实验室补助(150)+值班时间(月工作量)×5。 4. 以此雇员类为基类,从中派生出行政人员类,其中要求在行政人员类中加入一个计算行政人员工资的方法,行政人员工资=基本工资(900)+行政补贴(200)。 三、实验任务分解 四、实验步骤 1. 建立工程 (1) 新建一个win32 Console Application的工程: 打开VC++开发软件,从[文件]菜单中点击[新建]菜单项,出现如图所示: 在右上角的工程下输入该工程的名称,如 c10,并设置该工程所保存的路径。 最后点击确定。

(2) 当确定后会出现要你选择工程类型的对话框,如图所示:请选择一个空的工程,即 第一个选项。 (3) 当单击确定后,工程建立完毕,接下来建立程序源文件,请再单击[文件]菜单下的[新 建]出现原先出现的对话框,请选择“文件”选项卡中的c++ source file选项,并取名,如c10 (4)当确定后,就进入了源代码的编辑窗口,如图所示:

实验六继承与派生

继承与组合 一、实验目的 1.了解继承在面向对象程序设计中的重要作用。 2.进一步理解继承与派生的概念。 3.掌握通过继承派生出一个新的类的方法。 4.了解虚基类的作用和用法。 5.掌握类的组合 二、实验内容 1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。 (1) #include using namespace std; class A {public: A(){cout<<"A::A() called.\n";} virtual ~A(){cout<<"A::~A() called.\n";} }; class B:public A {public: B(int i) { cout<<"B::B() called.\n";

buf=new char[i]; } virtual ~B() { delete []buf; cout<<"B::~B() called.\n"; } private: char *buf; }; void fun(A *a) { cout<<"May you succeed!"<

A::A() called. B::B() called. May you succeed! B::~B() called. A::~A() called. (2) #include using namespace std; class A{ public: A(int a,int b):x(a),y(b){ cout<<"A constructor..."<

实验3 继承和派生类的应用

3.1实验目的 1.掌握多重继承和派生类的方法 2.掌握初始化基类成员的方法 3.掌握定义虚基类的方法 3.2实验内容与步骤 1.上机实验题一 定义一个日期(年、月、日)的类和一个时间(时、分、秒)的类,并由这两个类派生出日期和时间类。主函数完成基类和派生类的测试工作。 ⑴分析 定义一个描述日期的类,构造函数完成年、月、日的初始化,包含一个重新设置日期的成员函数,一个获取日期的成员函数。该类可定义为: class Date{ int Year,Month,Day; //分别存放年、月、日 public: Date(int y=0, int m=0,int d=0) { Year= y; Month = m; Day = d; } void SetDate(int ,int ,int ); void GetDate(char *); }; 函数SetDate完成数据成员的赋初值。函数GetDate要将整数年、月、日变换成字符串后,存放到参数所指向的字符串中。把一个整数变换成字符串可通过库函数: char * _itoa(int a , char *s, int b); 来实现,参数a为要变换的整数,b为数制的基数(如10,表示将a转换为对应的十进制的字符串),转换的结果存放到s所指向的字符串中。函数返回变换后字符串的首指针。该成员函数可以是: void Date::GetDate(char *s) { char t[20];

_itoa(Year,s,10); //将年变换为字符串表示 strcat(s,"/"); //年、月、日之间用“/”隔开 _itoa(Month,t,10); //将月变换为字符串表示 strcat(s,t); //将年、月字符串拼接 strcat(s,"/"); _itoa(Day,t,10); strcat(s,t); //将年、月、日拼接成一个字符串} 定义描述时间的类与描述日期的类类同,然后用这二个类作为基类,公有派生出描述日期和时间的类。 简化的参考程序如下: #include #include #include class Date{ int Year,Month,Day; //分别存放年、月、日 public: Date(int y=0, int m=0,int d=0) { Year= y; Month = m; Day = d; } void SetDate(int ,int ,int ); void GetDate(char *); }; void Date::SetDate(int y,int m,int d ) { Year= y; Month = m; Day = d; } void Date::GetDate(char *s) { char t[20]; _itoa(Year,s,10); strcat(s,"/"); _itoa(Month,t,10); strcat(s,t); strcat(s,"/"); _itoa(Day,t,10); strcat(s,t); } class Time { int Hours,Minutes,Seconds; //时、分、秒 public: Array Time(int h=0,int m=0, int s=0)

实验6 继承与派生

实验6 继承与派生 专业:计算机科学与技术班级:10计本1班学号:姓名: 实验地点:B102实验时间:2011/11/23 指导教师:李佐勇 一、实验目的 1.理解继承与派生、单继承与多继承的概念; 2.理解基类与派生类的定义及使用方法,派生类对象的定义与初始化方法; 3.理解继承与派生过程中,把派生类作为基类构成类族的概念及虚基类的概念。 二、实验环境 一台PC机,Windows XP操作系统,V isual C++ 6.0开发环境。 三、实验内容 1、由在校人员类(Person)作为基类派生出学生类(Student): 在校人员类有数据成员:编号(ID)、姓名(Name)、性别(Sex)、年龄(Age),要求有如下函数成员:构造函数、获取编号的函数和输出所有成员的函数。把在校人员类作为基类,通过公有继承,派生出学生类,派生类新增成员数据有数学(Math)、物理(Physical)、英语(English)和C++程序设计(CPP)四门课程以及总成绩(Total);新增成员函数有构造函数和输出所有成员的函数。main()完成派生类对象的定义和有关成员函数的测试。 2、由学生类、课程类作为基类,共同派生出选课类。 声明一个学生类(Student),有数据成员:学号(No)、姓名(Name)、性别(Sex)、年龄(Age),要求有如下函数成员:构造函数、输出所有成员的函数。 声明一个课程类(Lesson),有数据成员:课程编号(Cno)、课程名称(Cname)、学时数(Chour),要求有如下函数成员:构造函数、输出所有成员的函数。 将学生类和课程类作为基类,通过公有继承,共同派生出选课类(SL),派生类新增数据成员:成绩(Score);新增函数成员:构造函数、输出所有成员的函数。 main()完成派生类对象的定义和有关成员函数的测试。 3、由二维坐标点类Point作为基类派生出圆类Circle;再由圆类Circle作为基类派生出圆柱体类Cylinder。(提示:点类Point的数据成员为点坐标x、y,函数成员有构造函数和显示点坐标的函数show;Circle类新增数据成员为圆的半径radius,其成员函数show除了显示圆心的坐标外还能显示半径大小;Cylinder类新增数据成员为圆柱体高度height,其成员函数除了显示基类的所有数据成员外,还得显示圆柱体的高度) 四、实验记录 1、#include #include 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: "<

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

实验三继承和派生类 实验目的和要求 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..."<

继承与派生(实验题)

实验五继承与派生 一、实验目的 (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(类实现文件) 报告的书写注意事项: 报告包括实验目的,实验内容,实验设计(指出主要函数或者类,必要时附流程图),核心代码,运行结果,心得体会。

实验2继承与派生讲解

继承与派生实验2 实验目的2.1 类的继承,能够定义和使用类的继承关系。1.熟练掌握派生类的声明与实现方法。2.掌握 3.掌握类构造函数的初始化列表与作用域分辨符的使用方法。虚基类在解决二义性问题中的作用。 4.理解2.2 实验工具与准备工作在开始实验前,应回顾或复习相关内容。 Visual C++ 6.0等集成开发环境软件。需要一台主算机,其中安装有 2.3 实验内容 1.先阅读下列程序,写出执行结果。然后输入程序,调试程序,比较结果的正确性。 // 文件名: main.cpp #include // 预处理命令 // 使用标准命名空间std using namespace std; class A { public: : 公有函数// ?笩挠畯??尠构造A << endl; } // 构造函数 // A << endl; } 析构函数???潣瑵?? 析构}; class B: public A { public: : 公有函数// // 构造函数B << endl; } ?笩挠畯??尠构造// 析构B << endl; } 析构函数???潣瑵?? }; class C: public B { public: : // 公有函数// 构造函数C << endl; } 构造?笩挠畯??尠 C << endl; } 析构???潣瑵?? 析构函数// }; main(void) 主函数// int main(void) { 定义对象C obj; //

,输出系统提示信息调用库函数system( )// system(PAUSE); 0, 返回操作系统// 返回值return 0; } 2.先阅读下列程序,写出执行结果。然后输入程序,调试程序,比较结果的正确性。// 文件名: main.cpp #include // 预处理命令 using namespace std; // 使用标准命名空间std class A { protected: // 数据成员: int a; // 数据成员 public: // 公有函数: A(int x): a(x){ } // 构造函数 void Show() const{ cout << a << endl; } // 显示a之值 }; class B { protected: // 数据成员: int b; // 数据成员 public: // 公有函数: B(int x): b(x){ } // 构造函数 void Show() const{ cout << b << endl; } // 显示a与b之值 }; class C: public A, public B { public: // 公有函数: C(int x, int y): A(x), B(y){ } // 构造函数 void Show() const // 显示b之值 { cout << a << , << b << endl; } }; int main(void) // 主函数main(void) {

实验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之一。 多继承与单继承的主要区别从定义格式上看,主要是多继承的基类多于一个。

c++实验报告 (2)

面向对象程序设计 (C++) 实 验 报 告 指导老师:柯栋梁 学生:吴健 班级:软131 学号:139074164

目录 实验一、VC6、0环境入门与简单程序设计实验报告 (3) 实验二、函数的应用实验报告 (7) 实验三、类与对象实验报告 (14) 实验四、C++程序结构实验报告 (22) 实验五、数组、指针与字符串实验报告 (26) 实验六、继承与派生实验报告 (33) 实验七、多态性实验报告 (42) 实验八、面向对象综合实验实验报告 (48)

实验一、VC6、0环境入门与简单程序设计实验报告 系软件工程班级 131 学号 139074164 姓名吴健 同组者指导教师柯栋梁 一、实验目的: 1、熟悉VC++6、0开了环境并编写简单的C++程序。 3、使用C++语言编写简单的输入输出程序。 4、使用VC++6、0的DEBUG调试功能:单步执行、设置断点、观察变量值。 二、实验内容: 1、使用VC++建立一个标准C++程序,编译、运行如下程序: #include Int main() { Cout<<”Hello World!\n”; Cout<<”Welcome to C++!\n”; } 2、编程计算图形的面积。程序可计算圆形、长方形、正方形等的面积,运行时首先提示用户选择图形类型,然后根据不同图形类型,输入相关参数计算其面积,并将其显示出来。 3、使用DEBUG功能观察任务2程序运行中变量值的变化情况。 三、实验要求: 1、任务1要求熟悉VC++开发环境,并能够使用其建立第一个C++程序。 2、实验前要做好充分准备,包括程序清单、调试步骤、调试方法,以及对程序结果的分析等。 四、实验报告: 1、程序运行截图

实验二 类的继承与派生

实验二类的继承与派生 一、实验目的 1. 掌握类的声明和使用。 2. 掌握对象的声明和使用。 3. 掌握具有不同访问属性的成员的访问方式。 4. 观察构造函数和析构函数的执行过程。 5. 学习声明和使用类的继承关系,声明派生类; 6. 熟悉不同继承方式下对基类成员的访问控制; 二.实验内容 1. 设计一个用于人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、 id(身份证号)等等。具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号charid[20]。其中“出生日期”声明为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、组合。在测试程序中声明people 类的对象数组,录入数据并显示。 2. 从people(人员)类派生出student(学生)类,添加属性:班号char classNO[7];从people 类派生出teacher(教师)类,添加属性:职务char pship[11]、部门char departt[21]。从student 类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate 类和teacher 类派生出TA(助教博士生)类,重载相应的成员函数,测试这些类。 三 . 实验步骤 1.程序代码 第一题 #include #include using namespace std; class Date //日期类 { private: int year; int month; int day; public: Date(){} //默认构造 Date(int y,int m,int d) //带参构造 { year=y; month=m; day=d; }

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(助教生)类,注意虚基类的使用。重载相应的成员函数,测试这些类。 二、实验步骤 (1)编写程序声明基类Animal,成员变量age声明为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:error

实验六继承与派生之欧阳光明创编

继承与组合 欧阳光明(2021.03.07) 一、实验目的 1.了解继承在面向对象程序设计中的重要作用。 2.进一步理解继承与派生的概念。 3.掌握通过继承派生出一个新的类的方法。 4.了解虚基类的作用和用法。 5.掌握类的组合 二、实验内容 1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。 (1) #include using namespace std; class A {public: A(){cout<<"A::A() called.\n";} virtual ~A(){cout<<"A::~A() called.\n";} }; class B:public A {public: B(int i) { cout<<"B::B() called.\n"; buf=new char[i]; } virtual ~B() { delete []buf; cout<<"B::~B() called.\n"; } private: char *buf; }; void fun(A *a) { cout<<"May you succeed!"<

} int main() { A *a=new B(15); fun(a); return 0; } 1、 (1)程序运行结果: A::A() called. B::B() called. May you succeed! B::~B() called. A::~A() called. (2) #include using namespace std; class A{ public: A(int a,int b):x(a),y(b){ cout<<"A constructor..."<

相关文档
相关文档 最新文档