C C++程序设计 第2版 教学课件 ppt 作者 陈卫卫 电子教案 C第6章PPT-2

上传人:E**** 文档编号:89188607 上传时间:2019-05-21 格式:PPT 页数:50 大小:192KB
返回 下载 相关 举报
C C++程序设计 第2版  教学课件 ppt 作者 陈卫卫 电子教案 C第6章PPT-2_第1页
第1页 / 共50页
C C++程序设计 第2版  教学课件 ppt 作者 陈卫卫 电子教案 C第6章PPT-2_第2页
第2页 / 共50页
C C++程序设计 第2版  教学课件 ppt 作者 陈卫卫 电子教案 C第6章PPT-2_第3页
第3页 / 共50页
C C++程序设计 第2版  教学课件 ppt 作者 陈卫卫 电子教案 C第6章PPT-2_第4页
第4页 / 共50页
C C++程序设计 第2版  教学课件 ppt 作者 陈卫卫 电子教案 C第6章PPT-2_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《C C++程序设计 第2版 教学课件 ppt 作者 陈卫卫 电子教案 C第6章PPT-2》由会员分享,可在线阅读,更多相关《C C++程序设计 第2版 教学课件 ppt 作者 陈卫卫 电子教案 C第6章PPT-2(50页珍藏版)》请在金锄头文库上搜索。

1、第6章 类和对象(续),主要内容 6.1 基本用法 6.2 重载、组合和继承 6.3 虚拟和友元 6.4 模板,6.3 虚拟和友元,6.3.1 虚拟函数,利用虚拟函数和指向对象的指针实现动态多态性 程序运行期间确定调用同名函数中的哪一个,1指向对象的指针简单用法 指向基类类型的指针可以指向其子类的对象,例6-13 指向对象的指针用法示例,class A /定义基类A public: void display( ) /A的成员函数 cout “来自基类 A“endl; ; class B: public A /定义A的子类B public: void display_B( ) /B的成员函数 c

2、out“来自A的子类 B“endl; ;,例6-13 指向对象的指针用法示例,void main( ) A x,*pA,*pB; /A的对象x和指针pA、pB B y; /B的对象y pA= ,例6-13 指向对象的指针用法示例,void main( ) A x,*pA,*pB; /A的对象x和指针pA、pB B y; /B的对象y pA= ,例6-13 指向对象的指针用法示例,void main( ) A x,*pA,*pB; /A的对象x和指针pA、pB B y; /B的对象y pA= ,例6-13 指向对象的指针用法示例,void main( ) A x,*pA,*pB; /A的对象x和

3、指针pA、pB B y; /B的对象y pA= ,例6-13 指向对象的指针用法示例,void main( ) A x,*pA,*pB; /A的对象x和指针pA、pB B y; /B的对象y pA= ,将display改为虚拟函数,情况会有所不同!,2虚拟函数用法,虚拟函数的定义格式: 函数类型 virtual 函数名(形参表) /函数体 ,只有类的成员函数才能被定义成虚拟函数!,2虚拟函数用法,通过虚拟函数和指向对象的指针实现动态多态性: 1)在基类中定义一个公有虚拟函数 2)在子类中对这个虚拟函数重新定义: 函数头(函数类型、函数名、形参表、返回值类型等) 必须与基类中的虚拟函数相同 函数

4、体可以不同 3)通过指向基类的指针指向子类的对象调用虚拟函数时: 如果子类对基类中的虚拟函数作了重新定义,执行的便是子类中定义的同名函数 如果子类没对基类中的虚拟函数作重新定义,执行的便是从基类继承的那个函数,在子类中重新定义时可带virtual ,也可不带virtual,例6-14 虚拟函数用法示例,#include class A/定义基类A public: virtual void display( ) /A的虚拟函数 cout “来自基类 A“endl; ;,class B: public A /定义A的子类B public: void display( ) /对虚拟函数重新定义 co

5、ut“来自A的子类 B“endl; ;,例6-14 虚拟函数用法示例,#include class A /定义基类A public: virtual void display( ) /A的虚拟函数 cout “来自基类 A“endl; ;,class C: public A /定义A的子类C public: void display_C( ) /C的成员函数(不同名) cout“来自A的子类 C“endl; ;,例6-14 虚拟函数用法示例,void main( ) A x,*pA,*pB,*pC的; /定义类A对象x和指针pA、pB、pC B y; /定义类B的对象y C z; /定义类C的

6、对象z pA= /调用从A为继承来的成员函数 ,例6-14 虚拟函数用法示例,void main( ) A x,*pA,*pB,*pC的;/定义类A对象x和指针pA、pB、pC B y; /定义类B的对象y C z; /定义类C的对象z pA= ,例6-14 虚拟函数用法示例,void main( ) A x,*pA,*pB,*pC的;/定义类A对象x和指针pA、pB、pC B y; /定义类B的对象y C z; /定义类C的对象z pA= ,3纯虚拟函数用法,在基类中定义纯虚拟函数的一般格式: virtual 函数类型 函数名(参数表)=0;,=0没有实质性含义,仅仅表示这是一个纯虚拟函数

7、不带函数体(没有实现细节),基类中定义纯虚拟函数,仅起到函数声明的作用 退化成单纯的接口形式 具体的实现细节在子类中定义(必须的),例6-15 纯虚拟函数应用示例,分别通过普通虚拟函数和纯虚拟函数 计算x2、x3和x的任意y次方(xy)之值,#include #include ,例6-15 纯虚拟函数应用示例,class A /定义基类A protected: int x, y; /A的成员数据 public: virtual void set(int i, int j=1) /A的普通虚拟函数 x=i; y=j; virtual void display( )=0; /A的纯虚拟函数 ;,C

8、+允许函数的最后几个形参指定参数缺省值,调用函数时 实参可以少于形参,缺少实参的形参便取其缺省值,例6-15 纯虚拟函数应用示例,class square: public A /定义子类square,计算x平方 public: void display( ) coutx“的平方=“x*xendl; /显示x的平方值 ; class cube: public A /定义子类cube,算计x立方 public: void display( ) coutx“的立方=“x*x*xendl; /显示x的立方值 ;,例6-15 纯虚拟函数应用示例,class chpow: public A /定义子类ch

9、pow,计算x任意次方 public: void display( ) coutx“的“y“次方=“pow(double(x),double(y)endl; /显示x的y次方值 ;,例6-15 纯虚拟函数应用示例,void main( ) A *ptr; /定义指向基类的指针ptr square b2; cube b3; chpow bc; int b,c,t=1; while(t) /无限循环,控制反复计算 coutb; ptr=,例6-15 纯虚拟函数应用示例,ptr-set(b); /调用从基类继承来的set函数 ptr-display( ); /调用子类中的函数,输出b的平方值 cou

10、tb; ptr=,例6-15 纯虚拟函数应用示例,ptr-set(b,c); ptr-display( ); /调用子类中的函数,输出b的c次方值 coutt; ,6.3 虚拟和友元,6.3.2 虚拟基类,虚拟基类(virtual base class)用于解决 多重继承中出现的重复继承问题,定义子类时,指明虚拟基类的格式: virtual 继承权限 基类名,例如,定义子类B时,指定A为虚拟基类: class B: virtual public A /A被指定为B的虚拟基类 ; /类B的定义体,多重继承关系和继承结构示意图,继承关系: 类B和类C都是类A的子类(都到类A中继承) 类D同是类B和

11、类C的子类(分别到类B和类C中继承),多重继承关系图示,多重继承关系和继承结构示意图,若类A中有成员x,类B和类C各从类A中继承一个x 类D各从类B和类C中继承一个x(分别表示成B:x和C:x),多重继承关系图示,非虚拟基类导致的 多重继承结构图示,多重继承关系和继承结构示意图,若类A分别是类B和类C的虚拟基类,则 类D只从类A中继承一个x(表示成B:x或C:x或A:x或x),多重继承关系图示,虚拟基类导致的 多重继承结构图示,例6-16 使用虚拟基类的多重继承示例,#include class A /定义基类A protected: int x; ; class B: virtual pub

12、lic A /定义子类B,指定A为其虚拟基类 protected: int y; ; class C: virtual public A /定义子类C,指定A为其虚拟基类 protected: int z; ;,例6-16 使用虚拟基类的多重继承示例,class D: public B, public C /定义由B和C多重派生出的子类D public: void setab(int m,int n,int p,int q) B:x=m, y=p; /分别为从类B继承来的x和y赋值 C:x=n, z=q; /分别为从类C继承来的x和z赋值 void display( ) cout“由B中继承的

13、 x=“B:x“ “y=“yendl; cout“由C中继承的 x=“C:x“ “z=“zendl; ;,例6-16 使用虚拟基类的多重继承示例,void main( ) D obj; /定义类D的对象obj obj.setab(10,20,30,40); /调用类D的成员函数setab obj.display( ); /调用类D的成员函数display ,6.3 虚拟和友元,6.3.3 友元,分为:友元函数(friend function)和友元类(friend class) A(函数或类)是类B的友元,则A可以访问类B所有成员 (包括公有成员、私有成员和保护成员),只有类B对A作友元声明,

14、A才能以友元身份访问B的成员 (A不能主动要求作为B的友元) 即使类A是类B的友元,B也不能以友元身份访问A的成员(除非A也将B列为自己的友元) 友元关系不是对称的,不传递,也不能继承,6.3 虚拟和友元,6.3.3 友元,1友元函数用法 指定函数A作为类B的友元函数须“体内声明,体外定义” 在类B的定义体内对函数A作友元声明 在类B的定义体外对函数A进行定义(定义方式同一般函数) 友元函数声明的一般格式: friend 函数类型 函数名(形参表);,例6-17 友元函数的用法示例,#include class B /定义类B friend void A(B ,例6-17 友元函数的用法示例,

15、void A(B /输出对象b的成员i的值 ,输出结果: temp=22 a.i=11 b.i=10,6.3 虚拟和友元,6.3.3 友元,2友元类用法 指定类A作为类B的友元类 在类B的定义体内对类A作友元声明 一般格式: class B /定义类B friend class A; /声明类A是类B的友元类 /定义类B的成员 友元类A的对象可以访问类B的所有成员,例6-18 友元类的用法示例,#include class B /定义类B friend class A; /友元类声明 private: int i; /类B的私有成员i ; class A /定义类A B x; public: A( ) x.i=10; void addi() x.i+; void display( ) coutx.iendl; ;,例6-18 友元类的用法示例,void main( ) A a; /定义类A的对象a a.addi( ); cout“a.i=“; a.display( ); ,6.4 模板,6.4.1 函数模板,两种模板: 函数模板(function template) 类模板(Class template),函数模板中含有形式类

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号