当前位置:文档之家› 继承与派生参考代码

继承与派生参考代码

继承与派生参考代码
继承与派生参考代码

1197: 继承与派生1

Description

请以点类Point为基类派生出一个圆类Circle。圆类Circle的数据成员为r(私有属性,存储圆的半径,圆心的点坐标通过继承点类Point加以实现),成员函数有构造函数Circle、计算圆的面积函数Area、计算圆的周长函数Perimeter和输出函数Display,其中构造函数实现基类和圆类的数据成员的初始化,Display函数实现圆心坐标(利用基类Point的Display实现)、圆的半径、圆的面积(利用Area函数实现)和圆的周长(利用Perimeter函数实现)的输出。请编写圆类的定义及成员函数实现,并在主函数中定义圆类对象,验证各个函数的正确性。说明:圆周率PI的取值为

已知Point类的定义及main代码如下:(不允许改动)

class Point

{

public:

Point(double xx,double yy); //constructor

void Display(); //display point

private:

double x,y; //平面的点坐标x,y

};

int main()

{

double x,y,r;

cin>>x>>y>>r; //圆心的点坐标及圆的半径

Circle C(x,y,r);

(); //输出圆心点坐标,圆的半径,圆的面积,圆的周长

return 0;

}

Input

Output

Sample Input

Sample Output

Center:Point,

Radius:

Area:

Perimeter:

**************************************************************************

#include

using namespace std;

class Point

{

public:

Point(double xx,double yy) //constructor

{

x=xx;

y=yy;

}

void Display()//display point

{

cout<<"Center:Point("<

}

private:

double x,y; //平面的点坐标x,y

};

class Circle:public Point

{

private:

double r;

public:

Circle(double xx,double yy,double rr):Point(xx,yy)

{

r=rr;

}

double Area()

{

return *r*r;

}

double Perimeter()

{

return 2**r;

}

void Display()

{

Point::Display();

cout<<"Radius:"<

cout<<"Area:"<

cout<<"Perimeter:"<

}

};

int main()

{

double x,y,r;

cin>>x>>y>>r; //圆心的点坐标及圆的半径

Circle C(x,y,r);

(); //输出圆心点坐标,圆的半径,圆的面积,圆的周长

return 0;

}

1217: 继承与派生2

Description

Person类派生大学生CollegeStu类(1)。设计一个Person类,其属性包括姓名name和身份证号id,其中name为指针类型,id为整型,编写成员函数:构造函数Person、Display函数(显示数据成员信息)和析构函数;由Person类派生出大学生类CollegeStu,其属性有专业subject (指针类型),C++程序设计课程成绩score(double型),编写构造函数(实现数据初始化)、输出函数Display(包括name,id,subject,score)。main的代码如下:(不允许改动)

int main()

{

char name[81],subject[81];

int id;

double score;

cin>>name>>id>>subject>>score;

CollegeStu cs(name,id,subject,score);

();

return 0;

}

Input

Output

Sample Input

Zhangsan 2 Computer

Sample Output

Name:Zhangsan

ID:2

Subject:Computer

C++ Score:

**************************************************************************

#include

#include

using namespace std;

class Person

{

private:

char * name;

int id;

public:

Person()

{

name=NULL;

id=0;

}

Person(char *name1,int id1)

{

name=new char[strlen(name1)+1];

strcpy(name,name1);

id=id1;

}

~Person()

{

delete [] name;

}

void Display()

{

cout<<"Name:"<

cout<<"ID:"<

}

};

class Collegestu : public Person

{

private:

char * subject;

double score;

public:

Collegestu()

{

subject=NULL;

score=0;

}

Collegestu(char * name1,int id1,char * subject1,double score1):Person(name1,id1) {

subject=new char [strlen(subject1)+1];

strcpy(subject,subject1);

score=score1;

}

~Collegestu()

{

delete [] subject;

}

void Display()

{

Person::Display();

cout<<"Subject:"<

cout<<"C++ Score:"<

}

};

int main()

{

char name[81],subject[81];

int id;

double score;

cin>>name>>id>>subject>>score;

Collegestu cs(name,id,subject,score);

();

return 0;

}

1218: 继承与派生3

Description

Person类派生大学生CollegeStu类(2)。设计一个Person类,其属性包括姓名name和身份证号id,其中name为指针类型,id为整型,编写成员函数:构造函数Person、Display函数(显示数据成员信息)和析构函数;由Person类派生出大学生类CollegeStu,其属性有专业subject (指针类型),C++程序设计课程成绩score(double型),编写构造函数(实现数据初始化)、输出函数Display(只输出subject,score)。main的代码如下:(不允许改动)

int main()

{

char name[81],subject[81];

int id;

double score;

cin>>name>>id>>subject>>score; //输入学生的姓名、id号、专业、成绩

CollegeStu cs(name,id,subject,score);

::Display(); //输出姓名,id

(); //输出专业、成绩

return 0;

}

Input

Output

Sample Input

Lixu 5 Software

Sample Output

Name:Lixu

ID:5

Subject:Software

C++ Score:

**************************************************************************

#include

#include

using namespace std;

class Person

{

private:

char * name;

int id;

public:

Person()

{

name=NULL;

id=0;

}

Person(char *name1,int id1)

{

name=new char[strlen(name1)+1];

strcpy(name,name1);

id=id1;

}

~Person()

{

delete [] name;

}

void Display()

{

cout<<"Name:"<

cout<<"ID:"<

}

};

class CollegeStu : public Person

{

private:

char * subject;

double score;

public:

CollegeStu()

{

subject=NULL;

score=0;

}

CollegeStu(char * name1,int id1,char * subject1,double score1):Person(name1,id1) {

subject=new char [strlen(subject1)+1];

strcpy(subject,subject1);

score=score1;

}

~CollegeStu()

{

delete [] subject;

}

void Display()

{

cout<<"Subject:"<

cout<<"C++ Score:"<

}

};

int main()

{

char name[81],subject[81];

int id;

double score;

cin>>name>>id>>subject>>score; //输入学生的姓名、id号、专业、成绩

CollegeStu cs(name,id,subject,score);

::Display(); //输出姓名,id

(); //输出专业、成绩

return 0;

}

1219: 继承与派生4

Description

已知Base为基类,派生出Derived类,两个类的定义及main的代码如下(不允许改动),请完成Base类和Derived类的构造函数和析构函数,能够根据输入获取相应的输出。class Base

{

private:

int b;

public:

Base(int);

~Base();

};

class Derived:public Base

{

private:

int d;

Derived(int,int);

~Derived();

};

int main()

{

int a,b;

cin>>a>>b;

Derived dr(a,b);

return 0;

}

Input

Output

Sample Input

1 3

Sample Output

Base 1 says hello

Derived 3 says hi

Derived 3 says bye

Base 1 says goodbye

************************************************************************** #include

using namespace std;

class Base

{

private:

int b;

public:

Base(int c)

{

b=c;

cout<<"Base "<

}

~Base()

{

cout<<"Base "<

}

};

class Derived:public Base

{

int d;

public:

Derived(int c,int b):Base(c)

{

d=b;

cout<<"Derived "<

}

~Derived()

{

cout<<"Derived "<

}

};

int main()

{

int a,b;

cin>>a>>b;

Derived dr(a,b);

return 0;

}

1220: 继承与派生5

Description

由Array类派生出有序数组SortArray类,SortArray类中实现有序数组的插入。

已知Array类的定义如下(不允许增加成员函数):

class Array

{

public:

Array(); //构造函数,初始化为空数组(length置为0)

int Length(); //获取数组的实际长度

double Get(int pos); //获取data中下标为pos的元素的值

void Insert(int pos, double x); //在下标pos处插入x

void Display(); //输出线性表

private:

double data[MaxSize]; //存储元素(MaxSize为常量)

int length; //数组的实际长度

};

SortArray类定义如下(不允许增加成员函数):

class SortArray:private Array

{

public:

SortArray();

int Length(); //获取数组的实际长度

double Get(int pos); //获取data中下标为pos的元素的值

void Display(); //输出线性表

void Insert(double x); //递增有序数组中插入x,使序列仍有序

};

请实现Array类和SortArray类的成员函数,main中输入若干个实数,以0结束,利用SortArray 类中的Insert函数将它们插入data中,得到有序序列,再利用Display函数输出有序序列。代码如下(不允许修改):

int main()

{

SortArray sa;

double num;

while(1)

{

cin>>num;

if(fabs(num)<=1e-6) break;

try

{

(num); //

}

catch(char* message)

{

cout <

}

}

();

return 0;

}

Input

Output

Sample Input

Sample Output

The length:7

The elements:

**************************************************************************

#include

#include

using namespace std;

const int MaxSize=100; //顺序表的最大长度

class Array

{

public:

Array(); //构造函数,初始化为空数组(length置为0)

int Length(); //获取顺序表实际长度

double Get(int pos); //获取下标为pos的元素的值

void Insert(int pos, double x); //在下标pos处插入x

void Display(); //输出线性表

private:

double data[MaxSize]; //存储元素

int length; //数组的实际长度

};

Array::Array()

{ length=0;}

int Array::Length()

{ return length;}

double Array::Get(int pos)

{

if (pos<0 || pos>length-1) //下标不合法

throw "Illegal position";

return data[pos];

}

void Array::Insert(int pos, double x) //在下标pos处插入x

{

int i;

if (length>=MaxSize) //表满不能插入

throw "Overflow";

if (pos<0 ||pos>length) //下标不合法

throw "Illegal position";

for (i=length-1;i>=pos;i--) //将下标大于等于pos的元素后移data[i+1]=data[i];

data[pos]=x; //在下标pos处插入元素x

length++; //线性表长度增1

}

void Array::Display() //输出线性表

{

int i;

cout<<"The length:"<

cout<<"The elements:";

for (i=0;i

cout<

cout<

}

//class SortArray

class SortArray:private Array

{

public:

SortArray();

int Length();

double Get(int pos);

void Display();

void Insert(double x); //递增有序数组中插入x,使序列仍有序};

SortArray::SortArray():Array(){}

int SortArray::Length()

{ return Array::Length();}

double SortArray::Get(int pos)

{ return Array::Get(pos);}

void SortArray::Display()

{ Array::Display();}

void SortArray::Insert(double x)//insert

{

int i;

if(Length()>=MaxSize) throw"Overflow";

for(i=0;i

if(Get(i)>x)

break;

Array::Insert(i,x);

}

int main()

{

SortArray sa;

double num;

while(1)

{

cin>>num;

if(fabs(num)<=1e-6) break;

try

{

(num); //

}

catch(char* message)

{

cout <

}

}

();

return 0;

}

1221: 继承与派生6

Description

已知Array类的定义如下(不允许增加成员函数):

class Array

{

public:

Array(int size);

//构造函数,初始化数据成员(为data分配内存,MaxSize置为size,length置为0)int Length(); //获取顺序表实际长度

double Get(int pos); //获取下标为pos的元素的值

void Insert(int pos, double x); //在下标pos处插入x

void Display(); //输出线性表

private:

double *data; //存储元素

int MaxSize;

int length; //数组的实际长度

};

SortArray类定义如下(不允许增加其它成员函数):

class SortArray:private Array

{

public:

SortArray(int size);

int Length(); //获取顺序表实际长度

double Get(int pos); //获取下标为pos的元素的值

void Display(); //输出线性表

void Insert(double x); //递增有序数组中插入x,使序列仍有序

};

main中的代码如下(不允许改动):

int main()

{

int size;

cin>>size;

SortArray sa(size);

double num;

while(1)

{

cin>>num;

if(fabs(num)<=1e-6) break;

try

{

(num);

}

catch(char* wrong)

{

cout <

}

}

();

return 0;

}

请实现Array类和SortArray类的成员函数。

Input

Output

Sample Input

20 0

Sample Output

The length:7

The elements:

**************************************************************************

#include

#include

using namespace std;

class Array

{

public:

Array(int size); //构造函数,初始化数据成员(为data分配内存,MaxSize置为size,length置为0)

int Length(); //获取顺序表实际长度

double Get(int pos); //获取下标为pos的元素的值

void Insert(int pos, double x); //在下标pos处插入x

void Display(); //输出线性表

private:

double *data; //存储元素

int MaxSize;

int length; //数组的实际长度

};

Array::Array(int size)

{

MaxSize=size;

data=new double[MaxSize];

length=0;

}

int Array::Length()

{ return length;}

double Array::Get(int pos)

{

if (pos<0 || pos>length-1) //下标不合法

throw "Illegal position";

return data[pos];

}

void Array::Insert(int pos, double x) //在下标pos处插入x

{

int i;

if (length>=MaxSize) //表满不能插入

throw "Overflow";

if (pos<0 ||pos>length) //下标不合法

throw "Illegal position";

for (i=length-1;i>=pos;i--) //将下标大于等于pos的元素后移data[i+1]=data[i];

data[pos]=x; //在下标pos处插入元素x

length++; //线性表长度增1

}

void Array::Display() //输出线性表

{

int i;

cout<<"The length:"<

cout<<"The elements:";

for (i=0;i

cout<

cout<

}

class SortArray:private Array

{

public:

SortArray(int size);

int Length(); //获取顺序表实际长度

double Get(int pos); //获取下标为pos的元素的值

void Display(); //输出线性表

void Insert(double x); //递增有序数组中插入x,使序列仍有序};

SortArray::SortArray(int size):Array(size){}

int SortArray::Length()

{ return Array::Length();}

double SortArray::Get(int pos)

{ return Array::Get(pos);}

void SortArray::Display()

{ Array::Display();}

void SortArray::Insert(double x)//insert

{

int i;

if(Length()>=MaxSize) throw"Overflow";

for(i=0;i

if(Get(i)>x)

break;

Array::Insert(i,x);

}

int main()

{

int size;

cin>>size;

SortArray sa(size);

double num;

while(1)

{

cin>>num;

if(fabs(num)<=1e-6) break;

try

{

(num);

}

catch(char* wrong)

{

cout <

}

();

return 0;

}

1223: 继承与派生7

Description

已知由Automobille类派生出Car类和Wagon类,而后两者共同派生出StationWagon类,各类的定义及main中的代码(不允许改动)如下,请实现各个类的成员函数,完成相应的输出:

class Automobile //汽车类

{

private:

int power; //马力

public:

Automobile(int p);

void Display();

};

class Car:virtual public Automobile //小客车类

{

private:

int seat; //座位

public:

Car(int p,int s);

void Display();

};

class Wagon:virtual public Automobile //小货车类

{

private:

int load; //装载量

public:

Wagon(int p,int l);

void Display();

};

class StationWagon :public Car, public Wagon //客货两用车类

{

public:

StationWagon(int p, int s,int l);

void Display();

};

int main()

{

int power,load,seat;

cin>>power>>seat>>load;

StationWagon sw(power,seat,load);

();

return 0;

}

Input

Output

Sample Input

108 3 10

Sample Output

StationWagon:

Power:108

Seat:3

Load:10

************************************************************************** #include

using namespace std;

class Automobile //汽车类

{

private:

int power; //马力

public:

Automobile(int p=0)

{ power=p; }

void Display()

{ cout<<"Power:"<

};

class Car:virtual public Automobile //小客车类

{

private:

int seat; //座位

public:

Car(int p=0,int s=0):Automobile(p)

{ seat=s; }

void Display()

{ cout<<"Seat:"<

};

class Wagon:virtual public Automobile //小货车类

{

private:

int load; //装载量

public:

Wagon(int p=0,int l=0):Automobile(p)

{ load=l; }

void Display()

{ cout<<"Load:"<

};

class StationWagon :public Car, public Wagon //客货两用车类

{

public:

StationWagon(int p=0, int s=0,int l=0):Automobile(p),Car(p,s),Wagon(p,l){} void Display()

{

cout<<"StationWagon:"<

Automobile::Display();

Car::Display();

Wagon::Display();

}

};

int main()

{

int power,load,seat;

cin>>power>>seat>>load;

StationWagon sw(power,seat,load);

();

return 0;

}

继承和派生实验报告

实验目的与要求: 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 类。要求计算圆柱体的底面积、侧面积、全面积和体积。

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

福建农林大学金山学院实验报告 系(教研室):信息与机电工程系专业:计算机科学与技术年级: 实验课程:面向对象程序设计姓名:学号:  实验室号 计算机号 实验时间:指导教师签字:成绩: 实验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)

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.程序运行截图

继承与派生

实验四继承与派生 实验名称:继承与派生学时安排:4 实验类别:设计性实验实验要求:1人1组 一、实验目的和任务 1.理解继承的含义; 2.学习从现有类派生出新类的方式; 3.了解在派生类中如何使用基类的成员。 二、实验设备介绍 软件需求: Visual C++ 6.0或VS2008 硬件需求: 对于硬件方面的要求,建议配置是Pentium III 450以上的CPU处理器,64MB 以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。 三、实验内容和步骤 1.新建一个雇员类,它的数据成员有雇员代号,年龄,工资,性别,姓名,输入雇员资料方法,打印雇员资料方法。 2.以此雇员类为基类,从中派生出教师类,其中要求在教师类中加入一个计算教师工资的方法,教师工资=基本工资(1000)+课时(月工作量)×30。 3.以此雇员类为基类,从中派生出实验员类,其中要求在实验员类中加入一个计算实验员工资的方法,实验员工资=基本工资(800)+实验室补助(150)+值班课时(月工作量)×5。 4. 以此雇员类为基类,从中派生出行政人员类,其中要求在行政人员类中加入一个计算行政人员工资的方法,行政人员工资=基本工资(2000)+行政补贴(200)。 5.编写一个完整的程序,要求用户从键盘输入雇员的信息,然后在屏幕显示这些信息。【任务分解】

【程序示例】 文件Employee.h class Employee { protected: //补充完成数据成员定义 public: …… void inputEmployee(); // 用户从键盘输入雇员姓名和受聘日期 void showEmployee(); // 显示雇员姓名和受聘日期 }; 文件Teacher.h #include "Employee.h" class Teacher:补充完成代码 { private: // 补充完成数据成员定义:如基本工资、课时量。 public: …… void inputData(); void showData (); void calPay(); //计算工资 }; 文件Run.cpp #include " Teacher.h" #include using namespace std; int main() { Teacher t1; t1. inputData (); t1. showData (); return 0; }

Java 教案-第11章 继承和多态

第11章继承和多态 11.1介绍(Introduction) 面向对象编程允许从已有的类派生出新类,这叫继承(Inheritance)。继承是软件代码重用的一种机制,是一种在面向对象编程中非常重要的,而且强大的特性。假设已经定义了一个圆形,矩形和三角形的模型类,这些类有许多相同的特征,如何设计才能避免冗余,而且还能使系统易于理解和维护?答案就是使用继承。 11.2超类和子类 不同的类可能包含一些相同的,公共的特性和行为,把这些相同的东西组合在一起形成一个新的公共类来被其他类共享。继承就是定义一个一般类,然后扩展这个一般类形成更多的特殊类。这些特殊类继承了一般类的某些属性和操作。 这些类的对象我们可以称为几何对象,那么就创建一个称为几何类的一般类,这个一般类包含几何元素中的一些公共的属性和操作,如可以填充元素,修改线条的颜色,或撤销填充等。因此一般类GeometricObject可以作为所有几何对象的一般类模型。如图一般类的UML图,以及特殊类之间的关系图。 在Java术语中,一个类C1是从C2扩展来的,那么C1类称为子类,C2类称为父类或超类。子类继承父类可访问的数据和方法,同时可以扩展出自己的新的数据和方法如上图所示。代码如下。

思考一下,如下定义的构造方法是否正确?为什么? 答案是否定的,原因就是子类不能访问父类的私有的数据,但可以通过调用父类的get或set方法来访问它。

关于继承的几点注意: 1.子类不是超类的一个子集,实际上子类包含父类,并对其进行了扩展,内容比父类更丰富。 2.父类中私有的数据不能被它之外的任意类访问。因此,它们不能在子类中被直接使用。但是,如果在父类中定义了setter或getter,可以通过使用它们来访问这些数据。 3.并不是所有的is-a的关系都是继承关系,例如,一个方形是一个矩形,但却不能使用方向矩形来扩展方向,因为没有什么可扩展的。但却可以从几何类中进行扩展定义方形类。因为新的子类要比父类包含更多的详细信息。 4.继承被用来模型化is-a的关系。不要盲目的为了重用方法而扩展类。例如,没必要把一个树类扩展为人类,尽管二者具有很多相同的属性,比如高度和重量。子类和父类之间必须存在is-a的关系。 5.很多其他的编程如c++允许一个子类可以从几个父类扩展和继承,称多重继承,但Java不允许多重继承,即严格的单继承。即一个类的声明中只能有一个关键字extends,而且后面只有一个类名。如果想要拥有若干个类的特性,可以实现接口(在14章讲授)。 11.3supper关键字 子类继承了父类可访问的数据和方法,它是否继承构造方法呢?父类的构造方法可以在子类中被调用吗?在前面一章中,介绍过一个关键字this,表示对象自己。Super关键字则指它的父类,有2种方式被使用。 1.调用父类构造方法。 2.调用父类的其他方法 11.3.1 调用父类构造方法 调用父类的构造方法的格式如下: 其中super()调用父类无参数的构造方法,super(argument)调用父类和参数argument匹配的构造方法。但需注意的是,不管是使用哪条语句,调用父类的构造方法语句必须放在子类定义的构造方法之前,并且只能显示的调用父类的构造方法。如下语句是正确的。

继承与派生练习题

继承与派生练习题

习题八 第八章继承与派生 1.下列对派生类的描述中,(D.派生类中继承的基类成员的访问权限到派生类保持不变 )是错误的。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 2. 派生类的对象对它的哪一类基类成员是可以访问的?(A.公有继承的基类的公有成员) A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员 C. 公有继承的基类的私有成员 D. 保护继承的基类的公有成员 3. 关于多继承二义性的描述,(D.派生类和它的基类中出现同名函数时,将可能出现二义性 )是错误的。

A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性 C.解决二义性最常用的方法是作用域运算符对成员进行限定 D.派生类和它的基类中出现同名函数时,将可能出现二义性 4. 多继承派生类构造函数构造对象时,(B.虚基类的构造函数)被最先调用。 A.派生类自己的构造函数B.虚基类的构造函数 C.非虚基类的构造函数 D.派生类中子对象类的构造函数 5. C++类体系中,能被派生类继承的是( B.虚函数)。 A.构造函数 B.虚函数 C.析构函数 D.友元函数 6. 设有基类定义: class Cbase { private: int a; protected: int b; public: int c; }; 派生类采用何种继承方式可以使成员变量b成为自己的私有成员(A. 私有继承) A. 私有继承 B.保护继承

派生与继承实验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、学习利用虚基类解决二义性问题。 【实验内容】 题目: 2、设计一个用于人事管理的“people(人员)”基类。考虑到通用 性,仅只抽象出所有类型人员都有的属性:编号、姓名、性别、出生日期、身份证号等;从people(人员)类派生出student(学生)类,并添加属性:班号classNO;从people类派生出teacher(教师)类,并添加属性:职务principalship、部门Department;从student类派生出graduate (研究生)类,并添加属性:专业subject、导师teacher adviser(teacher 类);从graduate类和teacher类派生出TA(助教生)类。设计时注意虚基类的使用,注意重载相应的成员函数。测试这些类。

UML图: Date -year: int -month: int -day: int <>-Date(y: int, m: int, d: int) <>-Date(D: Date) +init(y: int, m: int, d: int): void +show(): void people #m_date: Date #m_no: long #m_ident_no: string #m_name: string #m_sex: string <>-people(no: long, name: string, sex: string, ident_no: string, year: int, month: int, day: int) <>-people(no: long, name: string, sex: string, ident_no: string, date: Date) <>-people(p: people) +init(no: long, name: string, sex: string, ident_no: string, year: int, month: int, day: int): void +init(no: long, name: string, sex: string, ident_no: string, date: Date): void +init(p: people): void +show(): void student #m_classno: string <>-student(person: people, classno: string) <>-student(stu: student) +show(): void teacher #m_principalship: string #m_department: string <>-teacher(p: people, principalship: string, department: string) <>-teacher(stu: teacher) +show(): void graduate #m_subject: string #m_adviser: teacher <>-graduate(s: student, subject: string, t: teacher) <>-graduate(g: graduate) +show(): void TA <>-TA(g: graduate, t: teacher) <>-TA(t: TA) +show(): void

实验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.了解继承在面向对象程序设计中的重要作用。 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..."<

实验四 继承与派生

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

《管理学》第十一章习题与详解

《管理学》第十一章习题与详解 管理学习题与详解 第十一章领导概论 1.何谓领导?领导在管理中的作用具体表现在哪些方面? 答:领导就是指挥、带领、引导和鼓励部下为实现目标而努力的过程。 领导者的作用具体表现在以下三个方面: (1)指挥作用。指在组织活动中,需要有头脑清醒、胸怀全局,能高瞻远瞩、运筹帷幄的领导者帮助组织成员认清所处的环境和形势,指明活动的目标和达到目标的路径。 (2)协调作用。指组织在内外因素的干扰下,需要领导者来协调组织成员之间的关系和活动,朝着共同的目标前进。 (3)激励作用。指领导者为组织成员主动创造能力发展空间和职业生涯发展的行为。 2.如何根据不同标准分析和研究不同类型领导的特点? 答:分析和研究不同类型领导的特点需要根据不同的标准: (1)按权力运用方式 ①集权式领导者。指把管理的制度权力相对牢固地进行控制的领导者。 集权式领导者的优势在于通过完全的行政命令,使管理的组织成本在其他条件不变的情况下,低于在组织边界以外的交易成本,可能获得较高的管理效率和良好的绩效。这对于组织在发展初期和组织面临复杂突变的环境时,是有益处的。但长期将下属视为某种可控制的工具,不利于其职业生涯的良性发展。 ②主式领导者。其特征是向被领导者授权,鼓励下属的参与,并且主要依赖于其个人专长权和模范权影响下属。

民主式领导者的缺陷在于权力的分散性使得组织内部资源的流动速度减缓,增大了组织内部的资源配置成本。其好处在于通过激励下属的需要,发展所需的知识,尤其是意会性或隐性知识,能够充分地积累和进化组织的能力,员工的能力结构也会得到长足提高。 (2)按创新方式划分 ①魅力型领导者。这种领导者有着鼓励下属超越他们预期绩效水平的能力。 魅力型领导者的影响力来自以下方面:①有能力陈述一种下属可以识别的、富有想像力的未来远景;②有能力提炼出一种每个人都坚定不移赞同的组织价值观系统;③信任下属并获取他们充分信任的回报;④提升下属对新结果的意识;⑤激励他们为了部门或组织利益而超越自身的利益。 ②变革型领导者。这种领导者鼓励下属为了组织的利益而超越自身利益,并能对下属产生深远而不同寻常的影响。变革型领导者关心每个下属的日常生活和发展需要,帮助下属用新观念分析老问题,进而改变他们对问题的看法,能够激励、唤醒和鼓舞下属为达到组织或群体目标而付出加倍的努力。 (3)按思维方式划分 ①事务型领导者。又称维持型领导者,这种领导者通过明确角色和任务要求,激励下属向着既定的目标活动,并且尽量考虑和满足下属的社会需要,通过协作活动提高下属的生产率水平。他们对组织的管理职能和程序推崇备至,重视非人格的绩效内容,并且严格遵守组织的规范和价值观。 ②战略型领导者。其特征是用战略思维进行决策。他们认为组织的资源由有形资源、无形资源和有目的地整合资源的能力构成。他们的焦点经常超越传统的组织边界范围中的活动,进入组织之间的相互关联区,并将这种区域视为组织潜在的利润基地。 战略型领导行为系指拥有预见、洞察、保持灵活性并向他人授权,以创造所必需的战略变革能力。战略领导是多功能的,涉及通过他人进行管理,包含整个企业的管理,并帮助组织处理随着竞争环境的巨变带来的变化。

继承与派生

第7章——继承与派生 一、选择题 1.在c++中,类之间的继承关系具有( )。 (a) 自反性 (b) 对称性 (c) 传递性 (d) 反对称性 2.下列关于类的继承描述中,( )是正确的。 (a) 派生类公有继承基类时,可以访问基类的所有数据成员,调用所有成员函数。 (b) 派生类也是基类,所以它们是等价的。 (c) 派生类对象不会建立基类的私有数据成员,所以不能访问基类的私有数据成员。 (d) 一个基类可以有多个派生类,一个派生类可以有多个基类。 3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( )。 (a) public成员(b) private成员(c) protected成员(d) 友员 4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( )。 (a) public成员(b) private成员(c) protected成员(d) 友员 5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( )。 (a) public成员(b) private成员(c) protected成员(d)友员 6.不论派生类以何种方式继承基类,都不能直接使用基类的()。 (a) public 成员(b) private成员 (c) protected成员(d) 所有成员 7.下面描述中,错误的是( )。 (a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问。 (b) 在基类定义的protected成员在私有继承的派生类中可见。 (c) 在基类定义的公有静态成员在私有继承的派生类中可见。 (d) 访问声明可以在公有继承派生类中把基类的public成员声明为private成员。 8.在c++中,可以被派生类继承的函数是( = )。 (a) 成员函数(b)构造函数(c) 析构函数(d)友员函数 9.在创建派生类对象时,构造函数的执行顺序是( = )。 (a) 对象成员构造函数—基类构造函数—派生类本身的构造函数 (b) 派生类本身的构造函数—基类构造函数—对象成员构造函数 (c) 基类构造函数—派生类本身的构造函数—对象成员构造函数 (d) 基类构造函数—对象成员构造函数—派生类本身的构造函数 10.当不同的类具有相同的间接基类时,( c )。 (a) 各派生类无法按继承路线产生自己的基类版本 (b) 为了建立惟一的间接基类版本,应该声明间接基类为虚基类 (c) 为了建立惟一的间接基类版本,应该声明派生类虚继承基类 (d) 一旦声明虚继承,基类的性质就改变了,不能再定义新的派生类 二、阅读下列程序,写出执行结果 1. #include using namespace std; class Base { public : void get( int i,int j,int k,int l ) { a = i; b = j; x = k; y = l;

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