书签 分享 收藏 举报 版权申诉 / 24
上传文档赚钱

类型C++面向对象程序设计课件.pptx

  • 上传人(卖家):晟晟文业
  • 文档编号:4637151
  • 上传时间:2022-12-27
  • 格式:PPTX
  • 页数:24
  • 大小:324.05KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《C++面向对象程序设计课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    C+ 面向 对象 程序设计 课件
    资源描述:

    1、1虚函数2虚拟表3虚机制的作用4虚函数的访问5纯虚函数和抽象类内容虚机制的引入虚机制的引入class Shapepublic:void Show()const cout“面积是:”Area()endl;float Area()const return 0;class Rectangle:public Shape public:Rectangle(float w,float h)mWidth=w;mHeight=h;float Area()const return mWidth*mHeight;private:float mWidth,mHeight;class Circle:public Sh

    2、ape public:Circle(float r):mRadius(r)float Area()const return mRadius*mRadius*3.14;private:float mRadius;main()Rectangel rect(1,2);Circle cir(1);Shape&sp1=rect;Shape&sp2=cir;sp1.Show();/输出是输出是0,为什么为什么?sp2.Show();/输出是输出是0,为什么为什么?静态编联与动态编联静态编联与动态编联u静态编联(早绑定,静态绑定):u编译期间就决定了程序运行时将具体调用哪个函数体函数体。即使没有主程序,也能

    3、知道程序中各个函数体函数体之间的调用关系。u例上页:Shape&sp1=rect;sp1.Show();u动态编联(晚绑定,动态绑定):u在运行期间,决定具体调用哪个函数体函数体。u动态编联的实现 u多种方式u虚机制(使用虚拟函数和虚拟函数表)使用虚函数使用虚函数(例例)class Shapepublic:virtual Shape()void Show()const cout“面积是:”Area()endl;virtual float Area()const return 0;class Rectangle:public Shape public:Rectangle(float w,floa

    4、t h)mWidth=w;mHeight=h;virtual float Area()const return mWidth*mHeight;private:float mWidth,mHeight;class Circle:public Shape public:Circle(float r):mRadius(r)virtual float Area()const return mRadius*mRadius*3.14;private:float mRadius;main()Rectangel rect(1,2);Circle cir(1);Shape&sp1=rect;Shape&sp2=

    5、cir;sp1.Show();/正确正确输出输出2 sp2.Show();/正确正确输出输出3.14 虚函数的声明和定义虚函数的声明和定义u虚函数的格式(必须是非静态成员函数)u声明:virtual 返回类型 函数名(参数列表)const;u定义:同一般成员函数u虚函数说明:u必须是成员函数u静态成员函数和构造函数、拷贝构造函数不能是虚的u析构函数可以是虚的u若类中有其它虚函数,那么析构函数也应该是虚的u赋值函数通常不定义为虚的u虚函数可以带const修饰,也可以不带u访问控制可以任意(public、protected、private)派生类中的虚函数派生类中的虚函数u通常采用public继承

    6、方式u继承自基类的虚函数(除虚的析构函数)u若基类的析构函数是虚的,那么派生类中的析构函数也是虚的u派生类中新的虚函数u派生类override基类中的虚函数(也称复写、重写)l 函数名字同基类中虚函数的名字l virtual关键字可省略l 返回类型必须与基类中虚函数的返回类型相同或相容l 可能会隐藏基类基类中重载的虚函数(overwrite,hide)class Parent public:virtual Parent();virtulal void F();int Normal();protected:virtual Parent*G();class Child:public Parent

    7、public:Child()void F();protected:Child*G();子类中的虚函数子类中的虚函数(例例)class Parent public:Parent();virtual Parent()void F();virtual void G();protected:virtual void K();class Child:public Parent public:Child();Child()void Other();void G();protected:void H();Parent类的3个虚函数:1.Parent:Parent()2.Parent:G()4.Parent:

    8、K()Child类的4个虚函数:1.Child:Child()2.Child:G()/Child中Override基类的G()3.Parent:K()/继承自父类的K()4.Child:H()/子类中新定义的H()虚函数表虚函数表(例例)Parent类的3个虚函数:1.Parent:Parent()2.Parent:G()4.Parent:K()Child类的4个虚函数:1.Child:Child()2.Child:G()/Child中Override基类的G()3.Parent:K()/继承自父类的K()4.Child:H()/子类中新定义的H()Parent类的虚函数表Child类的虚函数

    9、表虚函数表虚函数表(虚拟表、虚表、虚拟表、虚表、VTable)u虚函数表:u一个指针数组,各元素存放对应虚函数的入口地址u说明:u要求对应的类中至少有一个虚函数u一个类至多有一个虚拟表,同一个类的不同对象共享该虚拟表u首次创建该类实例对象时,在内存中同时创建该类的虚拟表u按照函数顺序的序号依次存放入口地址vptr 与与虚拟表虚拟表(例例)class Shapepublic:virtual Shape()void Show()const cout“面积是:”Area()Show();/正确正确输出输出9.42 delete pCircle;class Rectangle:public Shape

    10、 public:Rectangle(float w,float h)mWidth=w;mHeight=h;virtual float Area()const return mWidth*mHeight;private:float mWidth,mHeight;vptr与虚拟表与虚拟表rect栈区main()Rectangle rect(1,2);Shape&rRect =rect;Shape *pCircle=new Circle(3);rRect.Show();/正确正确输出输出2 pCircle-Show();/正确正确输出输出9.42 delete pCircle;堆区程序区虚函数的作用

    11、机制虚函数的作用机制-变量的静态类型和动态类型变量的静态类型和动态类型u静态类型:在编译期间,可以确定的变量类型 如:Child child;l 指针型:Parent *pObj=&child;l 引用型:Parent&obj=child;l 对象型:Parent obj=child;/对象型中obj的静态、动态一致u动态类型:在运行时,才可以确定的、对应于变量的真实类型main()Rectangle rect(1,2);Shape&sh1 =rect;Shape *psh2=new Circle(3);rect.Show();sh1.Show();/正确输出2 psh2-Show();/正确

    12、输出9.42 delete psh2;void userFunc(const Shape&);userFunc(rect);void userFunc(const Shape&sh)sh.Show();.虚函数的作用机制虚函数的作用机制-函数调用的编译函数调用的编译编译过程(以p-Func()为例)l 确定p的静态类型,如A*l 在A类中,寻找名字为Func,且参数可以匹配的函数l 若找不到,编译错误。l 若找到,该函数为virtual函数吗?l 若不是,编译成p-A:Func();l 若是虚函数,采用动态编联,从而编译成(*p-vptr)index(void*)p);,即在运行时,根据vpt

    13、r中的函数入口地址,选择执行函数。若希望pObj-Func();或 obj.Func();合法,必须有:u pObj/obj的静态类型中必须有匹配的函数Func;u 即使匹配的Func,永远不被调用,也要有虚函数作用机制虚函数作用机制(例例1)class A public:virtual A()virtual void f2();virtual void g();class B:public A public:virtual void f1();virtual void f2();virtual void f3();p1-f2()编译成编译成(*p1-vprt)1(void*)p1)p1-g(

    14、)编译成编译成(*p1-vprt)2(void*)p1)p2-f2()编译成编译成(*p2-vprt)1(void*)p2)p2-g()编译成编译成(*p2-vprt)2(void*)p2)delete p2编译成编译成.;(*p2-vprt)0(void*)p2)delete p1编译成编译成.;(*p1-vprt)0(void*)p1)A *p1=new A;p1-f2();p1-g();p1-f1();A*p2=new B;p2-f2();p2-g();p2-f1();delete p2;delete p1;/A类的虚拟表类的虚拟表&A:A()&A:f2()&A:g()/B类的虚拟表类的

    15、虚拟表&B:B()&B:f2()&A:g()&B:f1()&B:f3()vptrvptr虚函数作用机制虚函数作用机制(例例2)class Date public:Date(int y,int m,int d);virtual Date()bool IsLeap()const;virtual void Display()const protected:int mYear;int mMonth;int mDay;class ChinaDate:public Date public:ChinaDate(int y,int m,int d):Date(y,m,d)virtual void Displa

    16、y()const coutmYear“年年”;coutmMonth“月月”;coutmDay“日日”endl;protected:/other;class UsaDate:public Date public:UsaDate(int y,int m,int d):Date(y,m,d)virtual void Display()const coutmMonth“/”;coutmDay“/”;coutmYearDisplay();/12/31/2008delete pDate1;Date*pDate2=new ChinaDate(2008,12,31);pDate2-Display();/200

    17、8年年12月月31日日delete pDate2;虚函数作用机制虚函数作用机制(例例3)class Shapepublic:virtual Shape()void Show()const cout“面积是:”Area()Show();/正确正确输出输出9.42 delete pCircle;class Rectangle:public Shape public:Rectangle(float w,float h)mWidth=w;mHeight=h;virtual float Area()const return mWidth*mHeight;private:float mWidth,mHei

    18、ght;虚函数作用机制虚函数作用机制(例例4)Date应用例子:Date*p=new ChinaDate(2008,12,31);p-Display();delete p;或 void Func(Date*p)p-Display();int main()Date*p=new UsaDate(2008,12,31);Func(p);/输出 12/31/2008 delete p;p =new ChinaDate(2008,12,31);Func(p);/输出 2008年12月31日 delete p;虚函数的访问虚函数的访问u虚函数中访问的非虚函数静态编联,使用本地版本u非虚函数中访问的虚函数动

    19、态编联u虚函数中访问的虚函数动态编联u构造函数和虚函数l 构造函数不能为虚函数l 调用的虚函数采用静态编联,使用本地版本u析构函数和虚函数l 析构函数可以为虚函数l 若类中含有虚函数,那么析构函数也应为虚函数.l 调用的虚函数采用静态编联,使用本地版本class A public:virtual A()virtual void f()g();virtual void g()k();void k();class B:public A public:virtual void f()g();k();void k()h();void h();A*p1=new A;p1-X();A*p2=new B;p

    20、2-X();构造构造/析构函数调用本地版本的虚函数析构函数调用本地版本的虚函数class A public:A():mA(100)f();virtual A()f();virtual void f()cout mA;private:int mA;;class B:pulic Apublic:B():mB(200)virtual B()f();virtual void f()coutmB;private:int mB;;uB b;:先构造父类A,调用本地的f(),即A:f()uB b;:释放时,先析构B类,执行B:B();然后 要析构A类,需要执行A:A(),只能调 用本地的f(),即A:f()

    21、;虚函数的访问虚函数的访问(例例)class Base public:Base()vf();virtual Base()vf();virtual void vf()cout“Base:vf()”endl;virtual void vg()cout“Base:vg()”endl;vf();nvh();void nvh()cout“Base:nvh()”endl;vf();class Derived:public Base public:Derived()vf();virtual Derived()vf();virtual void vf()cout“Derived:vf()”endl;void

    22、nvh()cout“Derived:nvh”vf();p-vg();p-nvh();delete p;抽象类和具体类抽象类和具体类u 抽象类和具体类l 抽象类:不能被实例化l 具体类:可以实例化u 纯虚函数(一定是成员函数)l 格式:virtual ReturnType Func(.)const=0;l 抽象类:含有一个或多个纯虚函数。l 纯抽象类:除静态、构造、析构等函数均为纯虚函数.l 纯虚定义:对纯虚函数给出缺省实现(定义)u C+中的接口类l 是纯抽象类,且没有任何数据成员。u 抽象的派生类抽象类抽象类(例例)class Shape1 /抽象类public:virtual Shape1

    23、()void Show()const cout“面积是:”Area()endl;virtual float Area()const=0;class IAreable /接口类public:virtual IAreable()virtual float Area()const=0;class Polygon:public Shape1 ;/可以仍是抽象类class Rectangle:public Shape1 /具体类 public:virtual float Area()const ;class Farm:public IAreable /具体类 public:virtual float A

    24、rea()const .;/派生接口类class ICountry:public IAreable public:virtual int Population()const=0;class IClonable /接口类public:virtual IClonable();RTTI(Run Time Type Indentify)和和typeid、dynamic_cast操作操作dynamic_cast(exp)l T只能是指针或引用型l 若T为指针,成功则返回T类型指针;失败返回NULL.l 若T为引用,成功则返回T类型引用;失败产生bad_cast异常。l 例:class A ;class

    25、B:public A ;class C:pubilc A ;A*p1=new B;A*p2=new C;B*pb=dynamic_cast(p1);/成功pb非空if(pb)pb-Func();B&b=dynamic_cast(*p1);/成功则继续,失败则产生异常b.Func();typeid(exp)或 typeid(type_name),返回 const type_info 对象lexp是指针,则返回静态类型对应的;lexp是类类型(对象/引用),且含有虚函数,则返回动态类型对应的。l例class A/*含虚函数*/;class B:public A ;class C:public A ;A*p1=new B;typeid(p1)=typeid(A*)/TRUE typeid(p1)=typeid(B*)/FALSEtypeid(*p1)=typeid(A)/FALSEtypeid(*p1)=typeid(B)/TRUE

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:C++面向对象程序设计课件.pptx
    链接地址:https://www.163wenku.com/p-4637151.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库