C++面向对象程序设计课件.pptx
- 【下载声明】
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
展开阅读全文