纯虚函数与抽象类笔记_第1页
纯虚函数与抽象类笔记_第2页
纯虚函数与抽象类笔记_第3页
纯虚函数与抽象类笔记_第4页
纯虚函数与抽象类笔记_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、纯虚函数与抽象类一、纯虚函数只声明,不定义的虚函数称为纯虚函数。一般格式:virtual 函数类型 函数名(参数表)=0;纯虚函数的作用:在许多情况下,基类中不能为虚函数给出一个有意义的定义,而将它说明为纯虚函数,其作用是:为派生类提供一个一致接口(界面) 。它的定义留给派生类来做,派生类根据需要来定义各自的实现。注意:一个类可以说明一个或多个纯虚函数。纯虚函数与函数体为空的虚函数的区别:1、纯虚函数根本没有函数体所在的抽象类,不能直接进行实例化2、空的虚函数函数体为空所在的类可以实例化3、共同的特点可以派生生出新的类二、抽象类带有纯虚函数的类是抽象类;抽象类的主要作用通过它为一个类族建立一个

2、公共的接口,使它们能够更有效地发挥多态特性。抽象类刻画了一组子类的公共操作接口的通用语义,这些接口的语义也传给了子类。一般而言,抽象类只描述这组子类共同操作接口,而完整的实现留给子类。抽象类的说明:抽象类是一个特殊的类,是为了抽象和设计的目的而建立,它处于继承层次的结构的较上层,即只能用作其他类的基类,抽象类是不定义对象的。从一个抽象类派生的类必须提供纯虚函数的实现代码或在该派生类中仍将它说明为纯虚函数,否则编译出错。抽象类不能用作参数类型、函数返回类型或显式转换的类型,但可以说明指向抽象类的指针和引用,此指针可以指向它的派生类,实现多态性。构造函数不能是虚函数,析构函数可以是虚函数。抽象类综

3、合应用实例:/*/* copyright (C),2015-2020,TanZhou EDU.Co.,Ltd.FileName : VA.cppAuthor : Vico Version : 1.0 Date: 2015-07-23Description : /模块描述Version : /版本信息Function List: /主要函数及其功能 1._tmain. 2.FuctionTpro1.History : /历史修改记录 Vico 2015-07-23 1.0 build this moudle */*/ VA.cpp : 定义控制台应用程序的入口点。/#include stdafx

4、.h#include iostream#include stringusing namespace std;class B0 /抽象基类B0声明public: /外部接口virtual void display()=0; /纯虚函数成员;class B1:public B0 /派生类public:void display() /虚成员函数coutB1:Display()endl; ; class D1:public B1 /派生类public:void display() /虚成员函数coutD1:Display()display(); int _tmain(int argc, _TCHAR*

5、 argv)B0 *p; /声明抽象类基类对象指针B1 b1; /声明派生类对象b1D1 d1; /声明派生类对象d1p=&b1; /把对象b1的地址直接赋给p对象指针Fun(p); /调用派生类B1函数成员p=&d1; /把对象d1的地址直接赋给p对象指针 Fun(p); /调用派生类D1函数成员return 0;虚基类和抽象类的综合应用:/*/* copyright (C),2015-2020,TanZhou EDU.Co.,Ltd.FileName : AVS.cppAuthor : Vico Version : 1.0 Date: 2015-07Description : /模块描述V

6、ersion : /版本信息Function List: /主要函数及其功能 1._tmain. 2.FuctionTpro1.History : /历史修改记录 Vico 2015-07-23 1.0 build this moudle */*/ AVS.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include iostream#include stringusing namespace std;class Shape /抽象类public:virtual float area() const return 0.0; /虚函数virtual float v

7、olume() const return 0.0; /虚函数virtual void shapeName() const =0; /纯虚函数;class Point:public Shape /Point是Shape的公有派生类public:/继承下来/*virtual float area() const return 0.0; /虚函数virtual float volume() const return 0.0; /虚函数*/Point(float x=0,float y=0); /重载带参构造函数void SetPoint(float ,float); /给保护成员x,y进行赋值flo

8、at getX() const return x;float getY() const return y;/对纯虚函数进行定义virtual void shapeName() const coutPoint:;friend ostream &operator(ostream &,const Point&);protected:float x,y; /点的坐标;Point:Point(float a,float b)x=a; y=b;void Point:SetPoint(float a,float b)x=a; y=b;ostream & operator(ostream &output,co

9、nst Point &p)outputp.x,p.y;return output;class Circle:public Point /声明Circle派生类public:/继承下来/*virtual float area() const return 0.0; /虚函数virtual float volume() const return 0.0; /虚函数*/Circle(float x=0,float y=0,float r=0);void SetRadius(float);float GetRadius()const;virtual float area() const;/对纯虚函数时

10、行再定义(实现)virtual void shapeName()const coutCircle:;friend ostream & operator(ostream &,const protected:float radius;Circle:Circle(float a,float b,float r):Point(a,b),radius(r)void Circle:SetRadius(float r)radius=r;float Circle:GetRadius() const return radius;float Circle:area()constreturn 3.14159*rad

11、ius*radius;ostream &operator(ostream &output,const Circle &outputc.x,c.y,r=c.radius;return output;class Cylinder:public Circle /派生类Cylinderpublic:Cylinder(float x=0,float y=0,float r=0,float h=0);void setHeight(float);float getHeight() const;virtual float area() const;virtual float volume() const;/

12、对纯虚函数进行再定义virtual void shapeName() const coutCylinder:;friend ostream & operator(ostream &,const Cylinder &);protected:float height;Cylinder:Cylinder(float a,float b,float r,float h):Circle(a,b,r),height(h)void Cylinder:setHeight(float h)height=h;float Cylinder:getHeight()const return height;float C

13、ylinder:area()const return 2*Circle:area()+2*3.14159*radius*height;float Cylinder:volume()constreturn Circle:area()*height;ostream &operator(ostream &output,const Cylinder& cy)outputcy.x,cy.y,r=cy.radius,h=cy.height;return output;int _tmain(int argc, _TCHAR* argv)Point point(3.2,4.5); /建立Point类对象poi

14、ntCircle circle(2.4,12,5.6); /建立Circle类对象circleCylinder cylinder(3.5,6.5,5.2,10.5); /建立Cylinder类对象cylinderpoint.shapeName(); /静态关联(静态联编) coutpointendl;circle.shapeName(); /静态关联(静态联编)coutcircleendl;cylinder.shapeName(); /静态关联(静态联编)coutcylinderendl;coutshapeName(); /动态关联(动态联编)coutx=point.getX(),y=point.getY()narea=area()nvolume=volume()shapeName(); /动态关联(动态联编) coutx=circle.g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论