天津理工大学c++实验三

  • 格式:doc
  • 大小:58.50 KB
  • 文档页数:8

1 实验三 派生与继承 (2018-11-1) 一、 实验名称: 派生与继承。 二、 实验目的: (1) 理解继承的含义,掌握派生类的定义方法和实现; (2) 理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地访问继承层次中的各种类成员; (3) 理解保护成员在继承中的作用,能够在适当的时候选择使用保护成员以便派生类成员可以访问基类的部分非公开的成员; (4) 理解虚函数在类的继承层次中的作用,虚函数的引入对程序运行时的影响,能够对使用虚函数的简单程序写出程序结果。

三、 实验学时:4学时 四、 练习项目 1.先定义“点”类Point,再由“点”类派生出“圆”类Circle。 #include #define PI 3.14159 class Point // 定义“点”类 { int x, y; public: Point(int a=0, int b=0) { x=a; y=b; }

void ShowPoint( ) 2

{ cout<<"Point:("

int Gety( ) { return y; }

void Setxy(int a, int b) { x=a; y=b; } };

class Circle: public Point // 定义“圆”类,公有继承 { int r; // “圆”的半径 public: Circle(int x, int y, int ra) : Point(x, y) // B { r = ra; } void Setr(int ra) { r = ra; } double Area( ) //求圆的面积 { return PI*r*r; } void Move(int x_offset, int y_offset) //将圆心坐标平移 { int x1=Getx( ); //存取基类的私有成员 int y1=Gety( ); // D x1 += x_offset; y1 += y_offset; Setxy(x1, y1); // E } void ShowCircle( ) { ShowPoint( ); // F cout<<" Radius: "

{ Circle c(1, 1, 1); c.ShowCircle( ); c.Move(1, 2); c.ShowCircle( ); c.Setxy(4, 5); //重新置圆心坐标 c.Setr(2); //重新置半径值 c.ShowCircle( ); } (1) 记录程序的运行结果 (2) 测试能否将move函数体改写为 x=x+x_offset; y=y+y_offset;

2: 先定义“点”类Point和“半径”类Radius,再由Point类和Radius类多重派生出“圆”类Circle。 #include #define PI 3.14159 class Point { protected: //A int x, y; public: Point(int a=0, int b=0){ x=a; y=b; } void ShowPoint( ) { cout<<"Point:("

class Radius { protected: //B int r; public: 4

Radius(int ra=0){ r = ra; } void Setr(int ra){ r = ra; } int Getr( ){ return r; } }; class Circle : public Point, public Radius { public: Circle(int x, int y, int ra) : Point(x, y), Radius(ra) //D { }

double Area( ) { return PI*r*r; } //直接访问基类的保护成员

void Move(int x_offset, int y_offset) { x += x_offset; y += y_offset; }

void ShowCircle( ) { ShowPoint( ); cout<<"Radius: "

void main( ) { Circle c(1, 1, 1); c.ShowCircle( ); c.Move(1, 2); c.ShowCircle( ); c.Setxy(4, 5); c.Setr(2); c.ShowCircle( ); }

(1) 记录程序的运行结果 (2) 为什么可以直接使用x,y, 5

(3) 如果x,y在基类中是私有的行吗? 3. 多重继承中基类构造函数和析构函数的调用顺序 #include class Base1 { protected: int data1; public: Base1(int a=0) { data1 = a; cout<<"Base Constructor1\n"; } ~Base1( ) { cout<<"Base Destructor1\n"; } }; class Base2 { protected: int data2; public: Base2(int a=0) { data2 = a; cout<<"Base Constructor2\n"; } ~Base2( ) { cout<<"Base Destructor2\n"; } }; class Derived: public Base1, public Base2 { int d; public: Derived(int x, int y, int z):Base1(x), Base2(y) { d=z; cout<<"Derived Constructor\n"; } ~Derived( ) { cout<<"Derived Destructor\n"; } void Show( ) 6

{ cout<}; void main( ) { Derived c(1, 2, 3); c.Show( ); } (1) 记录程序的运行结果

4.对象成员构造函数和析构函数的调用顺序 #include class Base1 { protected: int data1; public: Base1(int a=8) { data1 = a; cout<} ~Base1( ) { cout<}; class Base2 { protected: int data2; public: Base2(int a=9) { data2 = a; cout<} ~Base2( ) { cout<}; class Derived:public Base1, public Base2 7

{ int d; Base1 b1, b2; public: Derived(int x, int y, int z) : Base1(x), Base2(y), b1(x+y), b2(x+z) { d=z; cout<<"Derived Constructor\n"; } ~Derived( ) { cout<<"Derived Destructor\n"; } void Show( ) { cout<}; void main( ) { Derived c(1, 2, 3); c.Show( ); } (1) 记录程序的运行结果

5. 编程题 假设某商店有如下几种货品:衬衣、帽子、立柜。每一种货物都有与其关联的说明信息。 衬衣:单价、产地、库存量、布料; 帽子:单价、产地、库存量、布料、样式(平顶或尖顶); 立柜:单价、产地、库存量、木料、颜色。 对这些商品的操作有:商品的进库(增加库存量),商品的出库(减少库存量),该类货 品总价格的计算。 要求自行设计数据结构,用类的继承与派生关系将上述的各种货品表示出来,并使用类 的构造函数来初始化每一类对象的初始数据。而后将上述的商品管理计算机化,完成操作要 求的功能。 【实现方法提示】 1.设立3 个不同的类来描述与处理3 种不同的货品。首先注意到上述3 种货品数据之 间的相互关联关系,可使用C++基类及其派生类的定义方法,先抽象出(“提取”出)如下每 一货品都具有的 “公有”数据构成一个所谓的基类base,而后再派生出所需的那3 个类。 (1)base(基)类:单价、产地、库存量; (2)由base 作为基类,派生出shirt(衬衣)类:增加“布料”数据; (3)由base 出发,派生出wardrobe(立柜)类:增加“木料”与“颜色”数据; (4)而后又由shirt 类出发(作为基类),派生出cap(帽子)类:增加“样式”数据。 2.对应于要对各类数据所进行的操作,而设立出类的如下几个成员函数。 (1)构造函数