实验二 继承与派生 (完整版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二继承和派生的基本概念
一、实验目的
继承与派生是面向对象的特性,是面向对象程序设计模拟客观世界的手段之一,本实验的内容包括介绍基类与派生关系,通过实验要求掌握以下内容。
1.掌握类继承与派生关系以及实现方法,理解类的层次结构。
2.掌握派生类构造函数初始化基类成员和对象成员的方法。
3.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。
二、实验内容
1.范例:定义一个继承与派生关系的类体系,在派生类中访问基类成员。先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员;以点为基类派生一个圆类,
增加表示半径的数据成员,重载显示和计算面积的函数;定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,
不能用派生方式。编程测试所定义的类体系。
【程序】
cl3=cl1;
cout<<"cl3圆面积:"<< cl3.Area()<< endl;
cl3.Show();
cout<<"线面积:"<< ln1. Area()<<'\t'<<"线长度:"<< ln1. GetLength()<< endl;
ln1.Show();
ln2.Show();
return 0;
}
【注意】
在Point 类中,将Line 类定义为友元,便于在Line 类中访问;Point 类的x 和y 定义为Protected 访问权限,便于派生类访问。
注意派生类的构造函数中对基类数据成员的初始化方法(即 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 ,再运行,结果如何?
在Line类和Circle类中无法访问Point类的私有成员x,y.
(3)如果不将Line 类设为 Point 类的友元,应采取什么措施?为哪个类增加数据或函数成员?
2.编程:多层派生练习,由上题Point 类和Circle 类继续派生出Cylinder 类。要求计算圆柱体的底面积、侧面积、全面积和体积。
#include
#include
using namespace std;
const float PI=3.14;
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="< }; class Circle:public Point{ protected: double radius; public: Circle() {x=0;y=0;radius=0;} Circle(double xv,double yv,double vv):Point(xv,yv) {radius=vv;} Circle(Circle& cir):Point(cir) { radius=cir.radius;} Circle& operator = (Circle& cir) { this->Point::operator =(cir); radius=cir.radius; return *this; } double Area() { return PI*radius*radius; } void Show() { cout<<"x="< } }; class Cylinder:public Circle { protected: double height; public: Cylinder(double xv,double yv,double r,double h): Circle(xv,yv,r) {height=h;} double AreaC() {return 2*PI*radius*height;} double Volume() {return PI*radius*radius*height;} void Print() { cout<<"圆心:"<<"("< 径:"< } }; int main() {Cylinder a(1,2,3,4) ; a.Print(); cout<<"底面积"< }