当前位置:文档之家› C++ 实验三 继承和派生类 (附答案)

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

C++ 实验三 继承和派生类 (附答案)
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:

char *buf;

};

void main()

{

B b(10);

}

(2)

#include

class A

{

public:

A(int a,int b):x(a),y(b)

{

cout<<"A constructor..."<

}

void Add(int a,int b)

{

x+=a;

y+=b;

}

void display()

{

cout<<"("<

}

~A()

{

cout<<"destructor A..."<

}

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..."<

}

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<<"("<

}

~B()

{

cout<<"destructor B..."<

}

};

void main()

{

B b(1,2,3,4);

b.display();

b.Add(1,3,5,7);

b.display();

}

(3)

#include

class A

{

public:

A(int a):x(a)

{

cout<<"A constructor..."<

}

int f()

{

return ++x;

}

~A()

{

cout<<"destructor A..."<

}

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..."<

}

int f()

{

A::f();

Aobj.f();

return ++y;

}

void display()

{

cout<

}

~B()

{

cout<<"destructor B..."<

}

};

class C:public B

{

public:

C(int a,int b,int c):B(a,b,c),A(0)

{

cout<<"C constructor..."<

}

};

class D:public C,virtual public A

{

public:

D(int a,int b,int c):C(a,b,c),A(c)

{

cout<<"D constructor..."<

}

~D()

{

cout<<"destructor D..."<

}

};

void main()

{

D d(7,8,9);

d.f();

d.display();

}

#include

class Base1

{

public:

Base1()

{

cout<<"class Base1!"<

}

};

class Base2

{

public:

Base2()

{

cout<<"class Base2!"<

}

};

class Level1:public Base2,virtual public Base1 {

public:

Level1()

{

cout<<"class Level1!"<

}

};

class Level2:public Base2,virtual public Base1 {

public:

Level2()

{

cout<<"class Level2!"<

}

};

class TopLevel:public Level1,virtual public Level2 {

public:

TopLevel()

{

cout<<"class TopLevel!"<

}

};

void main()

{

TopLevel obj;

}

2.调试下列程序,并对程序进行修改后再调试,指出调试中的出错原因。

#include

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="<

public:

int b;

};

void main()

{

B bb; //语句1

bb.seta(6); //语句2

bb.setb(3); //语句3

bb.show(); //语句4

cout<<"A::a="<

cout<<"B::b="<

cout<<"A::a="<

cout<<"B::b="<

}

按下列要求对程序进行修改,然后调试,对出现的错误分析其原因。

(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出现错误。因为B采用公有继承,所以B中和主函数中不能访问A中的私有函数。

(4)主函数中语句5出现错误。因为B采用公有继承,所以A 中保护成员在B中仍为保护成员,B中可以访问A中的保护成员,但不能通过类的对象访问类的保护成员。

3.

(1)

#include

class Myarray

{

protected:

int *alist; //指向动态申请的一组空间

int length; //整数的个数

public:

Myarray(int len) //初始化,动态申请存储空间

{

alist=new int[len];

length=len;

}

~Myarray() //对象结束时,释放所占用的存储空间

{

delete(alist);

cout<

}

void Input() //输入数据

{

int i;

for(i=0;i

{

cout<<"输入数组的第"<

cin>>alist[i];

}

}

void Display() //显示数据

{

cout<<'\n'<<"数组的成员为:"<<'\n';

for(int i=0;i

cout<

cout<

}

};

void main()

{

Myarray A(3);

A.Input();

A.Display();

}

(2)

#include

class Myarray

{

protected:

int *alist; //指向动态申请的一组空间

int length; //整数的个数

public:

Myarray(int len) //初始化,动态申请存储空间

{

alist=new int[len];

length=len;

cout<<"Myarray 初始化..."<

}

~Myarray() //对象结束时,释放所占用的存储空间

{

delete(alist);

cout<

}

void Input() //输入数据

{

int i;

for(i=0;i

{

cout<<"输入数组的第"<

cin>>alist[i];

}

}

void Display() //显示数据

{

cout<<'\n'<<"本数组成员依次为:"<<'\n';

for(int i=0;i

cout<

cout<

}

};

class SortArray:virtual public Myarray

{

public:

SortArray(int n):Myarray(n)

{

cout<<"SortArray 初始化..."<

}

void sort()

{

int i,j,k,temp;

for(i=0;i

{

k=i;

for(j=i+1;j

if(alist[j]

{

k=j;

}

temp=alist[i];

alist[i]=alist[k];

alist[k]=temp;

}

}

};

void main()

{

SortArray B(4);

B.Input();

B.Display();

cout<

B.sort();

B.Display();

}

(3)

#include

class Myarray

{

protected:

int *alist; //指向动态申请的一组空间

int length; //整数的个数

public:

Myarray(int len) //初始化,动态申请存储空间

{

alist=new int[len];

length=len;

cout<<"Myarray 初始化..."<

}

~Myarray() //对象结束时,释放所占用的存储空间

{

delete(alist);

cout<

}

void Input() //输入数据

{

int i;

for(i=0;i

{

cout<<"输入数组的第"<

cin>>alist[i];

}

}

void Display() //显示数据

{

cout<<'\n'<<"本数组成员依次为:"<<'\n';

for(int i=0;i

cout<

cout<

}

};

class ReArray: virtual public Myarray

{

public:

ReArray(int n):Myarray(n)

{

cout<<"ReArray 初始化..."<

}

void turn()

{

int i,t,j=length-1;

for(i=0;i

{

t=alist[i];

alist[i]=alist[j];

alist[j]=t;

}

}

};

void main()

{

ReArray B(4);

B.Input();

B.Display();

cout<

B.turn();

B.Display();

}

(4)

#include

class Myarray

{

protected:

int *alist; //指向动态申请的一组空间

int length; //整数的个数

public:

Myarray(int len) //初始化,动态申请存储空间

{

alist=new int[len];

length=len;

cout<<"Myarray 初始化..."<

}

~Myarray() //对象结束时,释放所占用的存储空间{

delete(alist);

cout<

}

void Input() //输入数据

{

int i;

for(i=0;i

{

cout<<"输入数组的第"<

cin>>alist[i];

}

}

void Display() //显示数据

{

cout<<'\n'<<"本数组成员依次为:"<<'\n';

for(int i=0;i

cout<

cout<

}

};

class AverArray:virtual public Myarray

{

public:

AverArray(int n):Myarray(n)

{

cout<<"AverArray 初始化..."<

}

float getaver()

{

float aver;

int sum=0,i;

for(i=0;i

sum+=alist[i];

aver=(float)sum/length;

return aver;

}

};

void main()

{

AverArray B(3);

B.Input();

B.Display();

cout<

cout<

}

(5)

#include

class Myarray

{

protected:

int *alist; //指向动态申请的一组空间

int length; //整数的个数

public:

Myarray(int len) //初始化,动态申请存储空间

{

alist=new int[len];

length=len;

cout<<"Myarray 初始化..."<

}

~Myarray() //对象结束时,释放所占用的存储空间{

delete(alist);

cout<

}

void Input() //输入数据

{

int i;

for(i=0;i

{

cout<<"输入数组的第"<

cin>>alist[i];

}

}

void Display() //显示数据

{

cout<

for(int i=0;i

cout<

cout<

}

};

class SortArray:virtual public Myarray //从小到大排序{

public:

SortArray(int n):Myarray(n)

{

cout<<"SortArray 初始化..."<

}

void get_SortArray()

{

int i,j,k,temp;

for(i=0;i

{

k=i;

for(j=i+1;j

if(alist[j]

{

k=j;

}

temp=alist[i];

alist[i]=alist[k];

alist[k]=temp;

}

}

};

class ReArray: virtual public Myarray //前后逆转{

public:

ReArray(int n):Myarray(n)

{

cout<<"ReArray 初始化..."<

}

void get_ReArray()

{

int i,t,j=length-1;

for(i=0;i

{

t=alist[i];

alist[i]=alist[j];

alist[j]=t;

}

}

};

class AverArray:virtual public Myarray //求平均值

{

public:

AverArray(int n):Myarray(n)

{

cout<<"AverArray 初始化..."<

}

float get_AverArray()

{

float aver;

int sum=0,i;

for(i=0;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 初始化..."<

}

void fun()

{

cout<

cout<

cout<

ReArray::get_ReArray();

Myarray::Display();

cout<

SortArray::get_SortArray();

Myarray::Display();

}

};

void main()

{

NewArray B(3);

B.Input();

B.Display();

B.fun();

}

继承和派生实验报告

实验目的与要求: 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="<

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:

派生与继承实验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)当确定后,就进入了源代码的编辑窗口,如图所示:

实验四 继承与派生讲解学习

实验四继承与派生

实验四派生类与继承 【实验类型】验证性实验【实验课时】2学时 【实验目的】 (1)理解类的继承的概念,能够定义和使用类的继承关系。 (2)掌握派生类的声明与定义方法。 (3)熟悉公有派生和私有派生的访问特性。 (4)学习虚基类在解决二义性问题中的作用。 【实验环境】 硬件:计算机 软件:Microsoft Visual C++ 6.0 【实验内容】 1、按要求阅读、编写、调试和运行以下程序。 (1)实验内容 ①定义一个基类MyArray,基类中可以存放一组整数。 class MyArray {public: MyArray(int leng); ~MyArray(); void Input(); void Display(); protected: long int *alist; // 指向动态申请的一组空间 int length;}; // 整数的个数 基类中有构造函数、析构函数、输入数据和输出数据的函数。 ②定义一个类SortArray继承自MyArray ,在该类中定义函数实现排序功能。

③定义一个类ReArray继承自MyArray ,在该类中定义函数实现逆转功能。 ④定义一个类AverArray继承自MyArray ,在该类中定义函数Aver求解整数的平均值。 ⑤定义NewArray类,同时继承了SortArray, ReArray和AverArray,使得NewArray类的对象同时具有排序、逆转、和求平均值的功能。在继承的过程中声明为虚基类,体会虚基类在解决二义性问题中的作用。 (2)实验程序 (参考) 程序如下: #include "iostream.h" #include "process.h" class MyArray {public: MyArray(int leng); ~MyArray(); void Input(); void Display(); protected: long int *alist; // 指向动态申请的一组空间 int length; // 整数的个数 }; MyArray::MyArray(int leng) { length=leng; alist=new long int[length]; if(alist==NULL) { cout<<"对不起,创建失败。请重试。 ";exit(1); } } MyArray::~MyArray() {

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 类图

实验四:派生类和继承(一)

福建农林大学金山学院实验报告 系(教研室):信息与机电工程系专业:计算机科学与技术年级: 实验课程:面向对象程序设计姓名:学号:  实验室号 计算机号 实验时间:指导教师签字:成绩: 实验4 派生类和继承(一) 一、实验目的和要求 (1)掌握派生类的声明与定义方法,进一步理解类的继承的概念,能够定义和使用类的继承关系。 (2)熟悉公有派生和私有派生的访问特性。 二、实验内容和原理 1、程序分析题(写出程序的输出结果,并分析结果)。

2、(1)定义一个基类animal,该类具有私有整型成员变量age,weight,构造派生类dog公有继承animal,dog类新增私有成员变量color,新增成员函数SetAge(int n)中直接给age赋值,新增成员函数SetWeight(int m)中直接给weight赋值,查看编译结果,并分析结果。(2)将类animal中的age和weight为公有成员,重做第一步,并分析结果。(3)将类animal中的age和weight为保护成员,重做第一步,并分析结果。(4)将派生类dog的继承方式改为私有继承方式和保护继承方式重做以上各小题,并分析结果。 三、实验环境 1. 硬件:PC机; 2. 软件:Windows操作系统、Visual C++ 6.0 四、算法描述及实验步骤 2.1 #include 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<<"请输入这条狗的岁数="; cin>>x;cout< 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)

实验六继承与派生

继承与组合 一、实验目的 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..."<

c++实验3 派生类与继承1

实验三派生类与继承 一、实验目的 1、学习类的继承,能够定义和使用类的继承关系。 2、学习派生类的声明与定义方法。 3、掌握类的定义和对象的声明。 4、熟悉公有派生和私有派生的访问特性。 5、掌握派生类构造函数和析构函数的执行顺序。 6、掌握利用访问声明调整基类成员在派生类中的访问属性。 二、试验内容 1、下面的程序可以输出ASCII字符与所对应的数字的对照表。修改下列程序,使其可以输出字母a到z(或任意两个字符间)与所对应的数字的对照表。class table { public: table(int p) { i=p; } void ascii(void); protected: int i; }; void table::ascii(void) { int k=1; for (;i<127;i++) { cout<

c=m; } void print(void); protected: char *c; }; void der_table::print(void) { cout< using namespace std; #include class table { public: table(int p) { i=p; } void ascii(void); protected: int i; }; void table::ascii(void) { int k=1; for (;i<=122;i++)

实验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)

类的继承与派生综合题

1. 类的继承与派生综合题1 题目描述 定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类。 要求: a.在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。在Saleman类中还包含数据成员:销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员:经理提成比例(totalDeductRate)和总销售额(totalAmount)。在SaleManager类中不包含其他数据成员。 b.各类人员的实发工资公式如下: 员工实发工资=基本工资+奖金*出勤率 销售员实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例 经理实发工资=基本工资+奖金*出勤率+总销售额*经理提成比例 销售经理实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例+总销售额*经理提成比例 c.每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。 主函数如下: int main() { Salemanobjsale(101101, "LD", 0.88f, 1200, 800, 0.05f, 10000); Manager objmana(101102, "NXG", 0.90f, 2500, 1000, 0.10f, 20000); SaleManagerobjsalemana(101103, "HDY", 0.99f, 3500, 2000, 0.20f, 100000, 0.20f,150000); objsale.Output(); cout<< "销售员的实发工资:" << " "; cout<

内蒙古科技大学面向对象的程序设计实验8 继承(一)

内蒙古科技大学 面向对象的程序设计 实验报告 一、实验目的 1.理解继承的含义以及声明; 2.理解共有派生、私有派生和保护派生的含义以及使用; 3.理解单派生类中构造函数和析构函数的调用顺序。 二、实验环境 编译器:Visual C++ 6.0. 操作系统:Windows 7 旗舰版 三、实验内容 2.1练习(一): 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include "iostream.h" class CBase { public: CBase(int a) :a(a) {

} protected: void print() { cout<<"a="<

实验四 继承与派生

实验四继承与派生 一、实验目的: 掌握利用单继承和多重继承的方式定义派生类的方法; 深刻理解在各种继承方式下构造函数和析构函数的执行顺序; 理解和掌握公有继承,私有继承和保护继承对基类成员的访问机制; 理解虚基类的概念以及引入虚基类的目的和作用。 二、实验时间: 三、实验地点: 四、实验内容: 1.运行以下程序,并对运行结果进行分析 #include"stdafx.h" #include using namespace std; class base{ int n; public: base(int a) {cout<<"constructing base class"<

c++实验8继承与派生上机练习题

1. 定义一个哺乳动物类Mamma,l 并从中派生出一个狗类Dog,要求: ( 1) 添加Dog 类的颜色数据成员,访问属性为私有,通过函数来对颜色进行设置和获取。 ( 2) 分别为基类和派生类添加相应的构造函数(有参、无参) 测试。 class Mammal { protected: int itsAge; int itsWeight; public: int GetAge(){return itsAge;} void SetAge(int age) {itsAge=age;} int GetWeight() { return itsWeight;} void SetWeight(int weight) {itsWeight= weight;} }; class Dog : public Mammal { // 定义Dog 类的数据成员和成员函数 }; 改: #include #include using namespace std; class Mammal { protected: int itsAge; int itsWeight; public: Mammal(); ~Mammal(); int GetAge(){return itsAge;} void SetAge(int age) {itsAge=age;} int GetWeight() { return itsWeight;} void SetWeight(int weight) {itsWeight= weight;} }; class Dog : public Mammal {下面给出Mamma类的定义,SetColor 和GetColor 成员和析构函数,并进行

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..."<

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所示。

继承与派生(实验题)

实验五继承与派生 一、实验目的 (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) 一、实验目的和要求 (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输入下列程序,分析程序运行结果........ 。 理解多重继承(画出类的层次结构图),注意派生类构造函数的定义格式,注意构造函

相关主题
文本预览
相关文档 最新文档