欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    面向对象程序设计C++第7章-课件ppt.ppt

    • 资源ID:70258840       资源大小:433.50KB        全文页数:46页
    • 资源格式: PPT        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    面向对象程序设计C++第7章-课件ppt.ppt

    在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么第七章 继承 7.1 7.1 概述概述 7.2 7.2 继承的实现继承的实现 7.3 7.3 继承方式继承方式 7.4 7.4 派生类的初始化和析构派生类的初始化和析构 7.5 7.5 虚基类虚基类 7.6 7.6 向上映射向上映射 7.7 7.7 程序举例程序举例 7.8 7.8 小结小结在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.1 7.1 概概 述述 类之间的继承关系是对现实世界中遗传关系的直接模拟,它表示类之间的内在联系以及对属性和方法的共享,即派生类可以沿用基类的某些特征。如果A类派生出B类,一般约定把A称为基类,把B称为派生类。继承具有传递性,如果C类继承B类,B类又继承A类,则C类继承A类。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么继承与派生问题举例 交通工具交通工具 轮船轮船 汽车汽车 飞机飞机客车客车 卡车卡车在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么-继承与派生的目的继承与派生的目的 继承的目的:实现代码重用。派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。C+中类的继承层次自然地表达了人们分析问题时所用的分类结构。大大改善了软件系统的可理解性和可维护性在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么例例 :基类:基类personperson class person public:void display(void);private:char name30;long no;int age;char sex;char*s;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.2 7.2 继承的实现继承的实现 派生类的声明派生类的声明 class 派生类名:继承方式 基类名1,继承方式 基类名2 派生类成员列表;;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 说说 明明 派生类不能继承基类的构造函数和析构函数。继承方式用于说明从基类继承来的成员的访问控制属性。如果派生类有多个基类,称为多重继承;如果 派生类只有一个基类,则称为单重继承。在派生类中定义一个与基类成员完全相同的成员,称为同名覆盖。直接使用派生类中的该成员名,就只能访问派生类定义的成员。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么例例 :高校人员类。:高校人员类。class teacher:public person class teacher:public person public:public:void display(void);/void display(void);/同名同名覆盖覆盖 private:private:char*c3;/char*c3;/主讲课主讲课程程 int salary;/int salary;/薪水薪水 ;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 class student:public personclass student:public person public:public:void display(void);/void display(void);/同同名覆盖名覆盖 private:private:int credit;/int credit;/学分学分 ;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 class employee:public personclass employee:public person public:public:void display(void);/void display(void);/同名覆同名覆盖盖 private:private:int grage;/int grage;/职务级别职务级别 int salary;/int salary;/薪水薪水 ;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.3 7.3 继承方式继承方式 不同继承方式的影响主要体现在:不同继承方式的影响主要体现在:派生类成员成员对基类成员的访问权限通过派生类对象对象对基类成员的访问权限 C+C+语言提供了语言提供了3 3种继承方式:种继承方式:公有继承(public)私有继承(private)保护继承(protected)如果在定义派生类时未声明继承方式,默认的继承方式是private。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.3.1 7.3.1 公有继承公有继承基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象只能访问基类的public成员。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么例例7.1 7.1 公有继承举例。公有继承举例。class A class A public:public:seta(int seta(int x=0);x=0);int int geta(void);geta(void);private:private:int a;int a;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 class B:public A/class B:public A/公有继承公有继承 public:public:setb(int x=0);setb(int x=0);int getb(void);int getb(void);private:private:int b;int b;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.3.2 7.3.2 私有继承私有继承基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的publicpublic和和protectedprotected成员,但不能直接访问基类的privateprivate成员。通过派生类的对象不能直接访问基类中的任何成员。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 例例7.2 7.2 私有继承举私有继承举 例例 class B:private A/class B:private A/私有私有继承继承 public:public:set(int x=0,int y=0);set(int x=0,int y=0);int getb(void);int getb(void);void display(void);void display(void);private:private:int b;int b;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.3.3 7.3.3 保护继承保护继承基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么例例7.3 7.3 保护继承举例。保护继承举例。class B:protected A/class B:protected A/保护继承保护继承 public:public:set(int x=0,int y=0);set(int x=0,int y=0);int get(void);int get(void);void display(void);void display(void);private:private:int b;int b;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.4 7.4 派生类的初始化和析构派生类的初始化和析构派生类的初始化不仅要考虑新增成员的初始化,还要考虑从基类继承来的成员的初始化。由于派生类无法继承基类的析构函数,派生类的析构同样离不开基类析构函数的支持,其执行顺序与构造函数正好相反。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.4.1 7.4.1 派生类的构造函数派生类的构造函数 派生类构造函数的语法形式派生类构造函数的语法形式 派生类名:派生类名(参数表):基类1(参数表),基类m(参数表),对象成员1(参数表),对象成员n(参数表)在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 说说 明明 派生类的对象在初始化时,先调用虚基类的构造函数;再按照基类在继承时声明的顺序,依次调用基类的构造函数;然后按照对象成员在派生类中定义的顺序,依次调用对象成员的构造函数;最后调用派生类的构造函数。析构函数的调用顺序与构造函数正好相反。如果基类定义了没有默认形参值的构造函数,则必须定义派生类的构造函数。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 间接基类的举例间接基类的举例 class Aclass A protected:protected:int a;int a;class B:public A class B:public A protected:protected:int b;int b;class C:public B class C:public B private:private:int c;int c;ABC有间接基类的派生类在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 派生类派生类C C的构造函数的构造函数 C:C(int x,int y,int z):B(x,y)C:C(int x,int y,int z):B(x,y)c=z;c=z;派生类派生类A A类和类和B B类的构造函数类的构造函数 A:A(int x)A:A(int x)a=x;a=x;B:B(int x,int y):A(x)B:B(int x,int y):A(x)b=y;b=y;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.4.2 7.4.2 继承与包含继承与包含包含支持的是“has-a”关系,即事物B是事物A的一个部分。“has-a”关系通过包含现有的类建立了新类,描述了整体与局部的关系。继承支持的是“is-a”关系,即事物B和A得一个种类。“is-a”关系通过继承现有的类建立了新类,描述了抽象与具体的关系。包含和继承都提倡建立与现有的类有许多共性的新类,实现软件重用。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.5 7.5 虚基类虚基类 7.5.1 多重继承多重继承 C+语言允许使用多重继承,使得程序员在设计派生类时,能够从各个基类得到更多的属性和方法。多重继承一定要在全盘接收的同时,注意消化和吸收,留其精华,弃其糟粕。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 多重继承案例多重继承案例 描述:一个三口之家,大家都知道其父亲会开车,母亲会唱歌。但是父亲还会修电脑,只有家里人知道。小孩既会开车又会唱歌甚至也会修电脑。母亲瞒着所有人在外面做家教。此外小孩还会打乒乓球。编制程序,用C+语言描述这三口之家一天从事的活动:先是父亲出去开车,然后母亲出去工作(唱歌),下班后去做两小时家教。小孩在俱乐部打球,在父亲回家后,开车玩,后又唱歌。晚上,小孩和父亲一起修电脑。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 小孩由父亲和母亲共同派生而来。父亲的方法有开车和修电脑,其中开车为众人所知,其访问控制属性是public;修电脑只有家里人知道,则其访问控制属性为protected。母亲如何知道父亲会修电脑呢?可以将母亲声明为父亲的友元类。class fatherclass father public:public:friend mother;friend mother;friend void fun1(father friend void fun1(father&p1,child&p2);&p1,child&p2);void driving();void driving();protected:protected:void repairing();void repairing();在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 母亲的方法有唱歌和家教,其中大家都知道母亲会唱歌,因此唱歌的访问控制属性是public;所有人都不知道母亲做家教,则做家教的访问属性应为private。为了让母亲做家教,定义一个普通函数fun2,并把它声明为母亲的友元函数。class motherclass mother public:public:void singing();void singing();friend void friend void fun2(mother&p);fun2(mother&p);private:private:void teaching(int void teaching(int h);h);在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 小孩继承了父亲和母亲的方法,有开车、修电脑、唱歌和做家教,其中做家教的方法不可访问。除此之外,小孩还新增了打乒乓球的方法。定义一个普通函数fun1,并把它声明为父亲和小孩的友元函数。class child:public father,public class child:public father,public mothermother public:public:friend void fun1(father&p1,child friend void fun1(father&p1,child&p2);&p2);void play_pp(char s30);void play_pp(char s30);在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.5.2 7.5.2 二义性二义性 定义定义 在多继承时,基类之间出现同名成员时,将出现访问时的二义性。例如:例如:派生类A3是从基类A1和基类A2共同派生而来。其中基类A1有1个数据成员a,基类A2有1个数据成员a,派生类A3也新增了自己的数据成员a。这样在A3类中就存在3个数据成员a,产生了二义性问题。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 解决方案解决方案 由于同名覆盖,在派生类A3中直接使用的a,是指新增的数据成员a。至于分别从基类A1和基类A2继承过来的a,可以使用基类名:a的方法访问。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么例例7.7 7.7 数据成员的二义性。数据成员的二义性。#include class A1 public:A1(int x);protected:int a;A1:A1(int x)a=x;class A2 public:A2(int x);在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 protected;int a;A2:A2(int x);a=x;class A3:public A1,public A2 public:A3(int x,int y,int z);void display(void);private:int a;A3:A3(int a,int y,int z):A1(x),A2(y)在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 a=z void A3:display(void)cout“A1:a=“A1:aendl;cout“A2:a=“A2:aendl;cout“a=“aendl;int main()A3 s(1,2,3);s.display();return(0);在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.5.3 7.5.3 虚基类虚基类 菱形继承菱形继承 如右图所示 A类派生出B类和C类,D类由B类和C类共同派生,我们称之为菱形继承。D类就拥有了间接基类A的数据成员的两个副本。ABCD菱形继承菱形继承在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 访问基类的成员访问基类的成员在派生类D中,如何访问从间接基类A继承来的数据成员?假设A类有一个数据成员a。只能采用B:a或者C:a的形式访问,即用直接基类和作用域运算符,唯一地标识从间接基类继承过来的数据成员。通过这种形式,能够使系统明确a是从哪条路径派生而来,从而访问到该数据成员。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 类的冗余类的冗余 派生类拥有间接基类成员的两个副本,这在大多数场合下是不必要的,会使得派生类过于庞大且访问不便。我们可以把类族中一些派生类的共同基类设置为虚基类,这样就确保了派生类中只有虚基类成员的一个副本。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 虚基类的实现虚基类的实现 声明形式声明形式 class 派生类名:virtual 继承方式 基类名 说明 一旦将基类A声明为某些派生类的虚基类,则它将自动成为以A为间接基类的所有派生类的虚基类。C+语言规定,虚基类成员的初始化由最远派生类的构造函数发动,最先执行而且只初始化一次。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 例例7.10 7.10 虚基类虚基类#include class A protected;int a;public;void set(int x);void A:set(int x)a=x;class B:virtual public A protected;int b;在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 class C:virtual public A protected;int c;class D:public B,public C private;int a;public:void set(int x);void display(void);void D:set(int x)a=x;b=x+1 在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 c=x+2 void D:display(void)cout“A:a=“A:aendl;cout“a=“a“b=“b“c=“cendl;int main()D s;s.set(1);s.A:set(4);s.display();return(0);在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.6 7.6 向上映射向上映射 定义定义 在类族中,越往上越抽象,越往下越具体。基类的对象可以被派生类的对象所替代,我们把 这种替代关系称为向上映射(upcast)。形式形式 C+语言允许3种形式的向上映射:1.把派生类的对象赋值给基类的对象。2.把派生类的对象作为基类的引用的初始化目标。3.使得基类的指针指向派生类的对象。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 向上映射的意义向上映射的意义 完成向上映射之后,派生类的对象就可以作为基类的对象使用。类族中越高层的类,其包容性就越强,接口也越统一。用一组基类的指针,分别指向类族中一批 不同派生类的对象,完成向上映射。使它们对外界展现出统一的接口,以方便用户的调用,而具体执行时,这些派生类的对象又会表现出各自不同的行为,这就是所谓的多态性。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 向上映射举例向上映射举例 A s0(0);A s0(0);B s1(0,1);B s1(0,1);C s2(0,2);C s2(0,2);D s3(0,2,3);D s3(0,2,3);A A *p4=&s0,&s1,&s2,*p4=&s0,&s1,&s2,&s3;for(int&s3;for(int i=0;i4;i+)i=0;idisplay();pi-display();ABCD类的层次图在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么 案例分析案例分析 统一给类族的各个对象发送消息,执行的却全是基类的方法。因为派生类的对象向上映射之后,发生了退化,只保留从基类继承过来的特性,而不再是派生类的对象了。在向上映射的基础上,只要引入虚函数的概念,就可以实现多态性。在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么7.87.8本章小结本章小结 主要内容主要内容 类的继承、类成员的访问控制、派生类的初始化和析构、虚基类、向上映射。达到的目标达到的目标理解类的继承关系,学会使用继承关系实现代码的重用。

    注意事项

    本文(面向对象程序设计C++第7章-课件ppt.ppt)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开