实验八 多态实现
【实验目的】
1、 了解继承和多态的作用和实现方式,掌握动态联编方法;
2、 掌握使用C++语言的抽象类和派生类实现继承性;
【实验内容】
1、 设计一个立体图形类(CStereoShape类),并满足如下要求:
•CStereoShape类有一个纯虚函数GetArea,能够获取立方体的表面积;
•CStereoShape类有一个纯虚函数GetVolume,能够获取立方体的体积;
2、 设计一个立方体类(CCube类),该类继承于CStereoShape类,并满足如下要求:
•CCube类有一个带参数的构造函数,其参数分别对应于立方体的长、宽、高。
•用一个成员函数来实现对立方体长、宽、高的设置。
•重载CStereoShape类的GetArea和GetVolume,分别完成立方体的表面积和体积的计算。
3、 设计一个球体类(CSphere),该类继承于CStereoShape类,并满足如下要求:
•CSphere类有一个带参数的构造函数,其参数对应于球体的半径。
•用一个成员函数来实现对球体半径的设置。
•重载CStereoShape类的GetArea和GetVolume,分别完成球体的表面积和体积的计算。
4、 实现一个main函数,在main函数中至少完成如下工作:
•实例化一个CCube类的对象a_cube和CSphere类的对象c_sphere;
•定义一个CStereoShape类的指针p;
•将a_cube的长、宽和高分别设置为4、5和6;将p指向a_cube,通过p将a_cube的表面积和体积打印到屏幕上;
•将c_sphere的半径设置为7;将p指向c_sphere,通过p将c_sphere的表面积和体积打印到屏幕上。
【实验要求】
1、编写实验内容要求的程序、编译并调试通过;
2、实验报告中记录编程过程中出现的错误与改正方法;
3、总结静态联编和动态联编的区别;
4、总结抽象类的特点及作用;
1 #include<iostream> 2 using namespace std; 3 const double PI=3.1415926; 4 class CStereoShape 5 {public: 6 virtual double GetArea()=0; 7 virtual double GetVolume()=0; 8 }; 9 class CCube:public CStereoShape 10 {public: 11 CCube(double len,double wid,double hei){ length=len;width=wid;height=hei;} 12 void Set(double len,double wid,double hei){ length=len;width=wid;height=hei;} 13 double GetArea(){return 2*(length*width+length*height+width*height);} 14 double GetVolume(){return length*width*height;} 15 private: 16 double length,width,height; 17 }; 18 class CSphere:public CStereoShape 19 {public: 20 CSphere(double rad=0){ radius=rad;} 21 void Set(double rad){ radius=rad;} 22 double GetArea(){return 4*PI*radius*radius;} 23 double GetVolume(){return 4/3.0*PI*radius*radius*radius;} 24 private: 25 double radius; 26 }; 27 int main(){ 28 CStereoShape *p; 29 CCube a_cube(0,0,0); 30 CSphere c_sphere(0); 31 a_cube.Set(4,5,6); 32 p=&a_cube; 33 cout<<"立方体的表面积:"<<p->GetArea()<<" 立方体的体积:"<<p->GetVolume()<<endl; 34 c_sphere.Set(7); 35 p=&c_sphere; 36 cout<<"球体的表面积:"<<p->GetArea()<<" 球体的体积:"<<p->GetVolume()<<endl; 37 return 0; 38 }
【错误及改正方法】:一,开始没有搞懂构造函数和成员函数设置参数的区别,后来知道了构造函数是在创建对象的时候对对象的数据成员进行初始化的,而成员函数设置是在数据成员初始化之后对其进行修改的。二,创建了有参数的构造函数,在主函数中创建对象的时候要有相应的实参值。 【实验分析】:静态联编和动态联编的区别:静态联编又称功能早绑定,动态联编又称为功能晚绑定。绑定就是把函数体与函数调用相联系,当绑定在程序编译阶段完成时就成为功能早绑定,绑定在程序运行阶段完成为功能晚绑定。动态联编的基础是虚函数,体现了程序设计的多态性。如果一个类至少有一个纯虚函数,该类就是抽象类。特点:抽象类只能作为其他类的基类来使用,不能建立抽象类对象,这只能用来为派生类提供一个接口规范,其纯虚函数的实现由派生类给出。不允许从具体类派生出派生类。抽象类不能用作参数类型,函数返回类型或显式转换的类型。如果派生类给出了基类所有纯虚函数的实现则不再为抽象类。抽象类可以定义普通成员函数和虚函数。