• 沒有找到結果。

实验五 派生和继承

【实验目的】

1.理解类的继承的概念,能够定义和使用类的继承关系。

2.掌握派生类的声明与定义方法。

3.熟悉公有派生、保护派生和私有派生的访问特性。

4.理解虚基类在解决二义性问题中的作用。

【实验内容】

1.仔细阅读下列程序,写出运行结果。

#include <iostream.h>

class A{

public:

A(int m){ cout<<"A constructor:"<<m<<endl; } ~A(){ cout<<"A destructor"<<endl; }

};

class B{

public:

B(int n){ cout<<"B constructor:"<<n<<endl;}

B(){cout<<"B destructor"<<endl;}

};

class C: public B,public A{

public:

C(int a,int b,int c,int d,int e):A(b),B(e),bb(c),aa(d) { cout<<"C constructor:"<<a<<endl; }

~C(){ cout<<"C destructor"<<endl; } private:

A aa;

B bb;

};

int main() {

C cc(1,2,3,4,5);

}

2.定义 Person 类,数据成员包含姓名变量 name,以及输出姓名的成员函数 PrintName()。

再从 Person 类派生出 Worker 类,该类包括数据成员 number 用来记录对象的工号、sex 用来记 录对象的性别、age 用来记录对象的年龄、add 用来记录对象的家庭住址;包括函数成员

printinfo()用来输出对象的个人信息。

要求:

(1)构造 Worker 类对象输出该对象的工号、年龄、家庭住址等信息。

(2)在 Worker 类的 printinfo()成员函数中须调用 Person 类的成员函数 PrintName()。

3.定义基类 myarray 来存放一组整数,基类中有构造函数、析构函数、输入数据和输出 数据的成员函数。

4.定义类 sortarray 继承自 myarray,在该类中定义成员函数实现排序功能。

5.定义类 rearray 继承自 myarray,在该类中定义成员函数实现逆转功能。

6.定义类 averarray 继承自 myarray,在该类中定义成员函数求解数组中的所有整数的平 均值。

7.定义 newarray 类,同时继承自 sortarray、rearray 和 averarray,使得 newarray 类的对象 同时具有排序、逆转和求平均值的功能。在继承 myarray 的过程中声明为虚基类,体会虚基类 在解决二义性问题中的作用。

【实验指导】

1.分析:注意派生类和基类中构造函数和析构函数的调用顺序。

程序运行结果如下:

B constructor:5 A constructor:2 A constructor:4 B constructor:3 C constructor:1 C destructor B destructor A destructor A destructor B destructor 2.参考程序为:

#include <iostream.h>

class Person{

public:

Person(char * n ){ name = n; } void PrintName(){ cout<<name<<' '; } private:

char * name;

};

class Worker:public Person{

public:

Worker(char * n,int nu,char * s,int ag,char *add):Person(n) { num = nu; sex = s; age = ag; address = add;}

void PrintInfo() {

PrintName();

cout<<num<<' '<<sex<<' '<<age<<' '<<address<<' '<<endl;

} private:

int num;

char * sex;

int age;

char * address;

};

int main() {

Worker b("张三",10168,"男",28,"中山路 128 号");

b.PrintInfo();

return 0;

}

3.参考程序为:

#include <iostream.h>

class myarray{

public:

myarray(int leng);

~myarray();

void input();

void display();

protected:

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

int length; //数组中元素的个数 };

myarray::myarray(int leng) {

alist=new int[leng];

length=leng;

}

myarray::~myarray() {

delete [] alist;

}

void myarray::input() {

cout<<"enter numbers:"<<endl;

int i;

int *p=alist;

for (i=0;i<length;i++) cin>>p[i];

}

void myarray::display() {

int i;

int *p=alist;

for (i=0;i<length;i++) cout<<p[i]<<" ";

cout<<endl;

}

void main() {

myarray a(5);

a.input();

a.display();

}

4.参考程序为:

#include <iostream.h>

class myarray{

public:

myarray(int leng);

~myarray();

void input();

void display();

protected:

int *alist;

int length;

};

myarray::myarray(int leng) {

alist=new int[leng];

length=leng;

}

myarray::~myarray() {

delete [] alist;

}

void myarray::input() {

cout<<"enter numbers:"<<endl;

int i;

int *p=alist;

for (i=0;i<length;i++) cin>>p[i];

}

void myarray::display() {

int i;

int *p=alist;

for (i=0;i<length;i++) cout<<p[i]<<" ";

cout<<endl;

}

class sortarray:public myarray{

public:

sortarray(int length):myarray(length){}

void sort();

};

void sortarray::sort() {

int i,j,temp;

for (i=0;i<length-1;i++) for (j=0;j<length-i-1;j++) if(alist[j]>alist[j+1]) {

temp=alist[j];

alist[j]=alist[j+1];

alist[j+1]=temp;

} }

void main() {

sortarray s(5);

s.input();

s.display();

s.sort();

s.display();

}

5.参考程序为:

#include <iostream.h>

class myarray{

public:

myarray(int leng);

~myarray();

void input();

void display();

protected:

int *alist;

int length;

};

myarray::myarray(int leng) {

alist=new int[leng];

length=leng;

}

myarray::~myarray() {

delete [] alist;

}

void myarray::input() {

cout<<"enter numbers:"<<endl;

int i;

int *p=alist;

for (i=0;i<length;i++) cin>>p[i];

}

void myarray::display() {

int i;

int *p=alist;

for (i=0;i<length;i++) cout<<p[i]<<" ";

cout<<endl;

}

class rearray:public myarray{

public:

rearray(int leng):myarray(leng) {}

void reverse();

};

void rearray::reverse() {

int i,temp;

for(i=0;i<length/2;i++) {

temp=alist[i];

alist[i]=alist[length-1-i];

alist[length-1-i]=temp;

} }

void main() {

rearray r(5);

r.input();

r.display();

r.reverse();

r.display();

}

6.参考程序为:

#include <iostream.h>

class myarray{

public:

myarray(int leng);

~myarray();

void input();

void display();

protected:

int *alist;

int length;

};

myarray::myarray(int leng) {

alist=new int[leng];

length=leng;

}

myarray::~myarray() {

delete [] alist;

}

void myarray::input() {

cout<<"enter numbers:"<<endl;

int i;

int *p=alist;

for (i=0;i<length;i++) cin>>p[i];

}

void myarray::display() {

int i;

int *p=alist;

for (i=0;i<length;i++) cout<<p[i]<<" ";

cout<<endl;

}

class averarray:public myarray{

public:

averarray(int leng):myarray(leng) {}

double aver();

};

double averarray::aver() {

int i,j;

double s=0;

for (i=0;i<length;i++) s=s+alist[i];

return s/length;

}

void main() {

averarray a(5);

a.input();

a.display();

cout<<"the aver is:"<<a.aver()<<endl;

}

7.参考程序为:

#include <iostream.h>

class myarray{

public:

myarray(int leng);

~myarray();

void input();

void display();

protected:

int *alist;

int length;

};

myarray::myarray(int leng) {

alist=new int[leng];

length=leng;

}

myarray::~myarray() {

delete [] alist;

}

void myarray::input() {

cout<<"enter numbers:"<<endl;

int i;

int *p=alist;

for (i=0;i<length;i++) cin>>p[i];

}

void myarray::display() {

int i;

int *p=alist;

for (i=0;i<length;i++) cout<<p[i]<<" ";

cout<<endl;

}

class averarray:virtual public myarray{

public:

averarray(int leng):myarray(leng) {}

double aver();

};

double averarray::aver() {

int i,j;

double s=0;

for (i=0;i<length;i++) s=s+alist[i];

return s/length;

}

class sortarray:virtual public myarray{

public:

sortarray(int length):myarray(length){}

void sort();

};

void sortarray::sort() {

int i,j,temp;

for (i=0;i<length-1;i++) for (j=0;j<length-i-1;j++) if(alist[j]>alist[j+1]) {

temp=alist[j];

alist[j]=alist[j+1];

alist[j+1]=temp;

} }

class rearray:virtual public myarray{

public:

rearray(int leng):myarray(leng) {}

void reverse();

};

void rearray::reverse() {

int i,temp;

for(i=0;i<length/2;i++) {

temp=alist[i];

alist[i]=alist[length-1-i];

alist[length-1-i]=temp;

} }

class newarray:public sortarray,public rearray,public averarray{

public:

newarray(int leng):myarray(leng),sortarray(leng),rearray(leng),averarray(leng) {}

};

void main() {

newarray n(5);

n.input();

n.display();

cout<<"the aver is:"<<n.aver()<<endl;

n.sort();

n.display();

n.reverse();

n.display();

}

相關文件