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

    C语言程序设计继承性和派生类.pptx

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

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

    C语言程序设计继承性和派生类.pptx

    第第 七 章章 继承性是面向对象程序设计中重要机制继承性是面向对象程序设计中重要机制之一之一。这种机制改变了过去传统的非面向对象程序设计中那种对不再适合要求的用户定义数据类型进行改写甚至重写的方法,克服了传统程序设计方法对编写出来的程克服了传统程序设计方法对编写出来的程序序无法重复使用而造成资源的浪费的缺点。无法重复使用而造成资源的浪费的缺点。面向对象程序设计的继承机制给我们提供了无限重复利用程序继承机制给我们提供了无限重复利用程序资资源的一种途径。源的一种途径。通过C+语言中的继承机制,可以扩充和完善旧的程序设计以适应新的需求,这样不仅可以节省程序开发的时间和资源,并且为未来程序设计增添了新的资源。第1页/共43页第一节 基类和派生类第2页/共43页第第 七 章章一、基类和派生类的基本概念:定义一个新类使其包含原来类的所有成员,同定义一个新类使其包含原来类的所有成员,同时还有自己的新成员,称这个新类是原来类的派生时还有自己的新成员,称这个新类是原来类的派生类(子类),原来类称基类(父类)。类(子类),原来类称基类(父类)。二、单继承和多继承:单继承:单继承:只有一个基类的继承。只有一个基类的继承。多继承多继承:具有两个或两个以上的基类的继承。具有两个或两个以上的基类的继承。如图:ABXYZ第3页/共43页第第 七 章章三、派生类的三种继承方式:1 1、公有继承方式(public)(public):特点是基类的公有成员和保护成员基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态都保持原有的状态,而基类的私有成员私有成员仍仍然是私有的。然是私有的。2 2、私有继承方式(private):(private):特点是基类的公有成员和保护成员都作为派生基类的公有成员和保护成员都作为派生类类的私有成员的私有成员,并且不能被这个派生类的子类所访问并且不能被这个派生类的子类所访问,而且基类的私有成员私有成员也也仍然是私有的。仍然是私有的。3 3、保护继承方式(protected)(protected):特点是基类的所有公有成员和保护成员都成为基类的所有公有成员和保护成员都成为派派生类的保护成员生类的保护成员,并且只能被它的派生类成员函数或只能被它的派生类成员函数或友友第4页/共43页第第 七 章章元访问元访问,基类的私有成员仍然是私有的。私有成员仍然是私有的。四、派生类的定义格式:1 1、单继承的定义格式:class class:;2 2、多继承的定义格式:classclass:,2 ;第5页/共43页第第 七 章章五、基类与派生类的关系:1 1、派生类是基类的具体化:基类是对若干个派生类的抽象,而派生类是基类的具体化。基类抽取了它的派生类的公共特征,而派生类通过增加行为将抽象类变为某种有用的类型。输入设备键盘鼠标器数字化仪第6页/共43页第第 七 章章2 2、派生类是基类定义的延续:先定义一个抽象基类,该基类中有些操作并未实现。然后定义非抽象的派生类,实现抽象基类中定义的操作。这时,派生类是抽象的基类的实现,即可看成是基类定义的延续。这也是派生类的一种常用的方法。3 3、派生类是基类的组合:在多继承时,一个派生类有多于一个的基类,这时派生类将是所有基类行为组合。注意注意:基类和派生类是相对而言的基类和派生类是相对而言的。一个基类可以是另一个基类的派生类,这样便形成了复杂的继承第7页/共43页第第 七 章章结构,出现了类的层次。一个基类派生出一个派生一个基类派生出一个派生类类,该派生类该派生类做另一个派生类的基类做另一个派生类的基类,则该派生类称为,则该派生类称为原原来基类的直接派生类,而来基类的直接派生类,而原来基类为原来基类为另一个另一个派生类派生类的的间接基类间接基类。第8页/共43页第二节 基类成员在派生类中 的访问权限第9页/共43页第第 七 章章 基类成员由于继承方式的不同在派生类中的访问权限不同,三种不同的继承方式的基类特性与派生类特性如表:继承方式 基类特性 派生类特性 公有继承 publicprotectedprivate publicprotected不可访问 私有继承 publicprotected private privateprivate不可访问 保护继承 publicprotected private protectedprotected不可访问 第10页/共43页第第 七 章章1、派生类对基类成员的可访问性:(1)、在公有继承方式下,基类中成员在派生类中不变。(2)、在私有继承方式下,基类中成员在派生类中为私 有。(3)、在保护继承方式下,基类中成员在派生类中为保 护。注意注意:无论哪种继承方式派生类都不能访问基无论哪种继承方式派生类都不能访问基类类中私有成员。中私有成员。2、派生类对象对基类成员的可访问性:只有公有继承方式下的基类公有成员才可访问只有公有继承方式下的基类公有成员才可访问。3、派生类的派生类对基类成员的可访问性:第11页/共43页第第 七 章章 在公有继承和保护继承方式下,基类中的公有在公有继承和保护继承方式下,基类中的公有成成员和保护成员都可访问。员和保护成员都可访问。例例1 1、分析程序中的访问权限,并回答所提的问题。#include class A public:void f1();protected:int j1;private:int i1;第12页/共43页第第 七 章章class B:public A /B/B类对类对A A类的继承是公有继类的继承是公有继承承 public:void f2();protected:int j2;private:int i2;class C:public B /C/C类对类对B B类的继承是公有继承类的继承是公有继承 public:void f3();第13页/共43页第第 七 章章回答下列问题:1、派生类B中成员函数f2()能否访问基类A中的成员:f1(),i1和j1吗?答:可以访问f1()和j1,而不可以访问i1。2、派生类 B 的对象b1能否访问基类A中的成员:f1(),i1和j1吗?答:可以访问f1(),而不可以访问i1和j1。3、派生类C中成员函数f3()能否访问直接基类B中的 成员:f2(),j2和 i2吗?能否访问间接基类A中的成员f1(),j1和i1吗?答:可以访问直接基类中的f2()和j2以及间接基类 中的f1()和j1,而不可以访问 i2和i1。第14页/共43页第第 七 章章4、派生类C的对象c1能否访问直接基类B中的成员:f2(),i2和j2吗?能否访问间接基类A中的成员:f1(),j1和i1吗?答:可以访问直接基类中的f2()和间接基类中的f1(),其他的都不可访问。5、从对(1)(4)问题的回答可得出对公有继承的什么结论?答:在公有继承时,派生类的成员函数可访问基类中的 公有成员和保护成员;派生类的对象仅可访问基类中 的公有成员。问题问题:如果将程序中的继承方式改为私有继承,问题将如何回答?第15页/共43页第第 七 章章例例2 2、分析下列程序,并回答所提的问题。#include class A public:void f(int i)coutiendl;void g()coutgn;class B:A /缺省的继承方式缺省的继承方式表示为表示为privateprivate public:void h()couthn;A:f;/将基类中的公有成员说明为派生类的公有将基类中的公有成员说明为派生类的公有成员成员;第16页/共43页第第 七 章章void main()B d1;d1.f(6);d1.g();d1.h();回答下列问题:1、执行该程序时,哪个语句会出现编译错?为什么?答:程序中 d1.g();d1.g();语句出现编译错。因为B是以私有 继承方式继承类A的,类A的所有成员对B类的对象都 是不可见的,所以B类的对象不可访问A类的成员函 数。第17页/共43页第第 七 章章2、去掉出错语句后,执行该程序后输出结果如何?答:将程序中d1.g();d1.g();语句去掉后,执行该程序输出结果为:6 h3、如将派生类B的继承改为公有继承方式该程序将输 出什么结果?答:如改为公有继承方式,程序中将不会出现编译错,执行该程序输出结果为:6 g h 第18页/共43页第三节 构造函数和析构函数第19页/共43页第第 七 章章一、构造函数:派生类的对象的数据结构是由基类中说明的数据成员和派生类中说明的数据成员共同构成。构造函数不能够被继承,派生类构造函数的一般格式:():(),()派生类构造函数的调用顺序:a、基类的构造函数 b、子对象类的构造函数(如果有的话)c、派生类构造函数第20页/共43页第第 七 章章二、析构函数:析构函数也不能被继承。因此当对象被删除时,在执行派生类的析构函数时,基类的析构函数也将被调用,执行顺序与执行构造函数时的顺序正好相反:a、执行派生类的析构函数b、执行基类的析构函数第21页/共43页第第 七 章章例3、一个构造派生类构造函数的例子。#includeclass A public:A()a=0;coutAs default constructor called.n;A(int i)a=i;cout As constructor called.n;A()coutAs destructor called.n void Print()const couta,;int Geta()return a;private:int a;class B:public A public:第22页/共43页第第 七 章章 B()b=0;coutBs default constructor called.n;B(int i,int j,int k);B()coutBs destructor called.n void Print();private:int b;A aa;B:B(int i,int j,int k):A(i),aa(j)b=k;coutBs constructor called.n;void B:Print()A:Print();coutb,aa.Geta()endl;第23页/共43页第第 七 章章void main()B bb2;bb0=B(1,2,5);bb1=B(3,4,7);for(int i=0;i2;i+)bbi.Print();执行该程序输出结果如下:As default constructor called.As default constructor called.Bs default constructor called.As default constructor called.As default constructor called.Bs default constructor called.第24页/共43页第第 七 章章As constructor called.As constructor called.Bs constructor called.Bs destructor called.As destructor called.As destructor called.As constructor called.As constructor called.Bs constructor called.Bs destructor called.As destructor called.As destructor called.1,5,23,7.4Bs destructor called.As destructor called.第25页/共43页第第 七 章章As destructor called.Bs destructor called.As destructor called.As destructor called第26页/共43页第五节 子类型和赋值兼容规则第27页/共43页第第 七 章章一、子类型:有一种类型A,它至少包含有另一种类型B的所有行为,则称类型A是类型B的子类型。子类型的关系是不可逆的。二、类型适应:类型适应是指两种之间的关系。类型A适应于类型B是指类型A的对象能够用于类型B的对象所能使用的场合。子类型和类型适应是一致的。A是B的子类型,则B必将适应A 例如,在公有继承方式下,派生类是基类的子类型,派生类必适应于基类。而且派生类的对象是基类的对象。第28页/共43页第第 七 章章三、赋值兼容规则:在公有继承方式下,派生类是基类的子类型。此时派生类对象与基类对象之间的关系满足赋值兼容赋值兼容规规则:则:1、派生类的对象可给基类对象赋值。2、派生类的对象可用来对基类对象的引用进行初始 化。3、派生类的对象地址值可用来给基类的对象指针赋值。第29页/共43页 第五节 多继承第30页/共43页第第 七 章章一、多继承的概念:多继承是指派生类具有多个基类多继承是指派生类具有多个基类,派生类与每派生类与每个基个基类之间的关系仍可看作是一个单继承。类之间的关系仍可看作是一个单继承。多继承可以看作是单继承的扩展。二、多继承派生类构造函数的定义格式:派生类名派生类名(总参数表总参数表):基类名基类名1 1(参数表参数表1 1)、基类名基类名2 2(参数表参数表2 2)子对象名子对象名(),n+1),派生类构造函数的函数体派生类构造函数的函数体 构造函数的执行顺序基本上与单继承构造函数的执行顺序相同,所不同的仅仅是多个基类构造函数多个基类构造函数的的第31页/共43页第第 七 章章执行顺序是按定义多继承类时所给定的基类的顺序。执行顺序是按定义多继承类时所给定的基类的顺序。多继承派生类的析构函数中也应包含其基类的析构函数,该析构函数的执行顺序与其构造函数的执行顺序相反。如:class A public:void f();class B public:void f();第32页/共43页第第 七 章章 void g();class C:public A,public B public:void g();void h();为了清楚地表示各类之间的关系,在多继承中在多继承中,常常采用一种称为采用一种称为DAGDAG的图示表示法的图示表示法,用图来说明派生类与多个基类之间的关系,例中类A类B和类C的DAG图可表示如下:第33页/共43页第第 七 章章 A f()B f(),g()C g(),h()三、多继承中的二义性问题:多继承中派生类对基类成员访问在下列两种情况下可能出现二义性。1、访问不同基类的相同成员时可能出现二义性:例如,C类有两个直接基类A类和B类,其中,A类和B类中都有一个公有成员函数f(),并且C类公有继承A和B,这时当C类的对象c1,访问基类成员f()时,c1.f()则会出现二义性。第34页/共43页第第 七 章章 为了避免出现二义性,则要用成员限定方法指出f()是属于哪个类的。即 c1.Af()c1.Af()或者或者 c1.Bf()c1.Bf()还有一种解决办法是在类C中定义一个同名成员f(),类C中的f()再根据需要来决定调用A:f(),还是B:f(),还是两者皆有,这样,c1.f()将调用C:f()。如:void f()A:f()第35页/共43页第第 七 章章或void f()B:f()或void f()A:f()B:f()2、访问共同基类中成员时可能出现二义性。例如,Aa AaAa Aa B1b1 B2b2 Cf(),c第36页/共43页第第 七 章章 如果在主函数中定义了类C中的对象:C cl;那么下面的两个访问语句都有二义性:c1.ac1.a;c1.Ac1.A:a a;而下面的两个访问是正确的:c1.Bl:a;c1.Bl:a;c1.B2:ac1.B2:a;第37页/共43页 第六节 虚基类第38页/共43页第第 七 章章一、虚基类引进的原因:一个类是一个派生类两个路径上的一个公共基类,那么这个公共基类将在派生类的对象中产生多个基类子对象。如果要想使这个公共基类在派生类中只产生一个子对象,则必须将这个基类设定为虚基类。而而实际上实际上,引进虚基类的真正目的是为了解决二义性引进虚基类的真正目的是为了解决二义性问问题。题。二、定义虚基类的方法如下:class B1:virtual public A;class B2:virtual public A;第39页/共43页第第 七 章章 Af(),a Af(),a Af(),a B1b1 B2b2 Cf(),c三、具有虚基类的派生类的构造函数:具有虚基类的派生类(如上例C类)的构造函数中不仅包含两个直接基类的构造函数,另外还包含虚基第40页/共43页第第 七 章章类A的构造函数,并且规定虚基类虚基类A A的构造函数优先的构造函数优先调调用,只调用一次,用,只调用一次,在B1类和B2类的构造函数中不再调用A类的构造函数。第41页/共43页第第 七 章章第42页/共43页感谢您的欣赏!第43页/共43页

    注意事项

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

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




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

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

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

    收起
    展开