1、数据的共享和保护以及多态性 武汉科技大学 C+上机实验报告 实验名称:实验四 数据的共享和保护以及多态性专业班级: 姓 名: 学 号:20130413一、 实验目的1 学习数据的共享和保护。2 学习使用虚函数实现动态多态性。二、 实验内容1 声明一个Dog类,自行分析设计出其可以拥有的静态数据成员和静态成员函数,设计完整程序并测试这个类,请分析写出静态数据成员和静态成员函数的功能和用法。2 声明类X、Y、Z。实现:Y的成员函数可以访问X的私有数据成员,Z的成员函数可以访问X的数据成员。用多文件结构实现以上功能。(各类中的数据成员和函数成员请自行思考设计)3 声明一个Vehicle(车)基类,有
2、Run、Stop等成员函数,由此派生出bicycle(自行车)类和motorcar(汽车)类,从bicycle类和motorcar类派生出motorcycle(摩托车)类,它们都有Run、Stop等成员函数。实现并测试这些类,注意虚基类和虚函数的使用。4 对people类重载“”运算符和“”运算符,“”运算符判断两个people类对象的id属性的大小;“”运算符实现people类对象的赋值操作。附:people类的属性:number(编号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。其中“出生日期”声明为一个“日期”类内嵌子对象。三、 实验注意事项程序中,需要编写一个
3、可执行函数与main主调函数,自主设计输入、输出值,使得结果可以由控制台显示输出。四、 实验程序代码(一) Dog类#include #include using namespace std;class Dogpublic: Dog()/默认构造函数 weight = 0; age = 0; name = ; void load(string na, int ag, float wgh)/录入函数 weight = wgh; age = ag; name = na; void show() cout *n狗名字: name n狗年龄:agen狗的体重:weight endl; static i
4、nt get_amount() /返回狗的数目,静态成员amount return amount; static void add_anmout()/调用静态成员amount,狗的数目+1 amount+; Dog()/析构函数private: float weight; int age; string name; static int amount;int Dog:amount = 0;Dog d2;/定义3只狗int add() float weight; int age; string name; cout *n请输入狗的名字: name; cout 请输入狗的年龄: age; cout
5、 请输入狗的体重重: weight; dDog:get_amount().load(name, age, weight); Dog:add_anmout(); return 0;int main() while (Dog:get_amount() 2) add(); dDog:get_amount()-1.show();/此时狗的数目已加,要显示上一只信息需-1 cout *n狗的总数: Dog:get_amount() endl; return 0;(二)XYZ的私有成员访问头文件中:class Xpublic: X(int a=0) x = a; /内联函数应该写在头文件里 X() fri
6、end class Y;/友元类,Y可以访问X的私有数据成员 friend class Z;/友元函数,Z中只有Zget_x()函数可以访问X私有成员 int Xget_x() return x; private: int x;class Ypublic: Y() Y() int Yget_x(const X&yx) return yx.x;/应该养成常引用的习惯;class Zpublic: Z() Z() int Zget_x(X&zx) return zx.x; /友元函数成员;/由于都是内联函数,故未使用源文件实现函数功能和部分分配空间的变量的初始化;主函数源文件:#include #
7、include XYZ.h/自定义头文件最好用“”书写方式using namespace std;int main () X A(1); Y B; Z C; cout X类对象A中的私有成员nx= A.Xget_x() nY类对象B访问A的私有成员nx= B.Yget_x(A) nZ类对象C访问A的私有成员nx= C.Zget_x(A) endl; return 0;(三)虚基类和虚函数的使用#include using namespace std; class vehicle public: vehicle(float s):speed(s) virtual void Run () cout
8、 车启动 endl; virtual void Stop() cout 车已停 endl; vehicle() protected: float speed; class bicycle : virtual public vehicle public: bicycle(float s, float w) :vehicle(s), weight(w) void Run() cout *n自行车速度: speed n自行车重: weight n自行车启动 endl; void Stop() cout 自行车已停 endl; bicycle() protected: float weight; cl
9、ass motorcar : virtual public vehicle public: motorcar(float s,int n) :vehicle(s), seatamount(n) void Run() cout *n汽车速度: speed n汽车核载人数: seatamount n汽车启动 endl; void Stop() cout 汽车已停 endl; motorcar()protected: int seatamount; class motorcycle : public bicycle, public motorcarpublic: motorcycle(float s
10、, float w, int n) :vehicle(s), bicycle(s,w), motorcar(s,n) void Run() cout *n摩托车速度: speed n摩托车重: weight n摩托车核载人数: seatamount n摩托车启动 endl; void Stop() cout 摩托车已停 endl; motorcycle() ; int main() vehicle a(15.5); bicycle b(15.5, 10.5); motorcar c(60, 4); motorcycle d(30.5,200,2); vehicle *p4 = &a,&b,&c
11、,&d ; for (int i = 0; iRun(); pi-Stop(); return 0;(四)People类,运算符重载#include#includeusing namespace std;enum SEX man, woman ; /性别属性为枚举类型class Datepublic: Date(unsigned int dy, unsigned int mon, unsigned int yr)/内联构造函数 day = dy; month = mon; year = yr; Date()/默认构造函数 day = 0; month = 0; year = 0; Date(D
12、ate&d) day = d.day; month = d.month; year = d.year; void operator =(Date d) day = d.day; month = d.month; year = d.year; int show(void) /内联成员函数 cout year 年 month 月 day 日 endl; return 0; Date() /析构函数private: unsigned int day, month, year;class Peoplepublic: People(string na, string num, SEX sx, Date
13、birth, char id_num19);/构造函数 People() People(People&p); int show(void); void operator =(People&p);/复制构造函数的功能一样,实现类的复制,且设为常成员函数,避免改变参数 int operator =(People&p); void show_name() cout 0)return 0; if (strcmp(id, p.id) = 0)return 1; if (strcmp(id, p.id) 0)return 2;int People:show(void) string temp; if (s
14、ex = man)temp = 男; else temp = 女; cout *n姓名: name n编号: number n性别: temp n出生日期:; birthday.show(); cout 身份证号: id n* endl; return 0;int main(void) Date birthday1(1, 1, 1995); People p1(A, 001, man, birthday1, 4201061995907361x); p1.show(); People p2(B, 002, man, birthday1, 42010619959073610); p2.show()
15、; People p3; p3 = p2; p3.show(); switch (p3 = p1) case 0:p3.show_name(); cout 的编号较大 endl; break; case 1:cout 两者编号一样大 endl; break; case 2:p1.show_name(); cout 的编号较大 endl; break; return 0;五、 实验运行结果(一) Dog类(二) XYZ的私有成员访问(三)虚基类和虚函数的实现(四)People类和运算符的重载六、 实验心得与体会本次试验所获颇多,很多收获都写在了程序的注释里,比如内联函数最好放在头文件里,方便声明,而在声明时内存会分配空间的变量或函数不能在,头文件里声明,以免在多个源文件里调用头文件时,一个变量或函数分配多个空间,造成连接错误,虚基类和虚函数在引用时的对应关系,隐藏规则等等等等,这里不再一一列举。在完成第四题的过程中,由于对运算符重载的错误理解,导致return空的类 ,而卡在这个 BUG上好久。用与复制构造函数一样的引用方法解决之后,身心为之畅然。总之,这次试验让我理解到了C+抽象类对象的强大之处。C+是一门更加符合人类思维逻辑的语言,在以后的学习中,我努力学习,掌握好这门强大的语言。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1