- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
高等程序设计
Advanced Program Design 高等程序设计 1、最简单的类定义 2 、 构造函数与析构函数 3、 类 的 派 生 4、 友 元 5 、静 态 成 员 这种虚函数机制有时是十分有用的,可以让程序员对基类的某些特性进行修改,而不用修改基类的程序。 class Shape{ int basex,basey; //基准点坐标 public: virtual void show( ); //显示图形 virtual void hide( ); //隐藏图形 void move(int dx,int dy) //移动图形 {hide( );basex+=dx;basey+=dy;show( );} }; 下面的例子实现了一个显示不同图形的类Shape: class Point:public Shape{ public: void show( ); void hide( );}; class Circle:public Shape{ int radius; public: void show( ); void hide( );}; 这里定义了一个基类Shape,然后从Shape派生了两个类Point和Circle。 在Shape类中,显示图形和隐藏图形的函数成员show和hide被声明为虚函数,move函数首先调用hide隐藏图形,修改图形的基准点后调用show显示图形来完成移动的工作; 对Point和Circle类只需要实现show和hide,而无须分别实现move。 如果基类B包含虚函数vf,类D是B的派生类,它包含一个同类型的函数vf,那么当D类对象d调用vf时,即使存取是通过指向B的指针进行,所做的调用仍然是D::vf。例如: struct B{ virtual void vf1( ); virtual void vf2( ); virtual void vf3( ); void f( ); }; class D:public B{ public: virtual void vf1( ); //virtual void vf2(int); //另一个函数,不是虚函数char vf3( ); //错误,形参与虚函数vf3 相同,但返回值不同 void vf3( ); void f( ); }; void extf( ) { D d; //声明D类对象 B *bp=d; //将D*转化为B* bp-vf1( ); //调用D::vf1 bp-vf2( ); //因D的vf2有不同参数,故调用B::vf2 bp-f( ); //调用B::f(非虚拟函数) } 虚函数在派生类中提供了不同的实现版本后,派生类的成员将被优先使用。 如果要通过派生类对象调用基类的该函数成员,可以使用名字解析运算符::来显式地指明。例如上面的例子中,如果要调用基类的vf1,可以用如下的语句调用: d.B::vf1( ); 同样在D类函数成员中,也可以使用名字解析运算符来调用基类的函数成员。 在C++中基类的虚函数成员可以不实现,称为纯虚函数。例如上面的Shape类,对Shape类无须提供show和hide的具体实现,只需在派生类中提供它们的实现就可以了。纯虚函数的声明方法如下: class Shape{ int basex,basey; //基准点坐标 public: virtual void show( )=0; //显示图形 virtual void hide( )=0; //隐藏图形 void move(int dx,int dy) //移动图形 {hide( );basex+=dx;basey+=dy;show( );} }; protected成员 从一个类中派生出一个类,不管基类是否使用public指明符,基类中的私有成员在派生类中都是不可访问的; 但是有时在派生类中确实需要访问基类的私有成员。 C++语言中,可以通过将基类的私有数据成员声明为protected来实现这一点。 struct Element{ //首先定义链表节点的数据结构 int val; Element * next; }; class List{
文档评论(0)