经济学继承与派生类.pptx
《经济学继承与派生类.pptx》由会员分享,可在线阅读,更多相关《经济学继承与派生类.pptx(140页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第5章继承与派生类5.1 继承与派生类5.2 派生类的构造函数和析构函数*5.3 调整基类成员在派生类中的访问属性的其他方法5.4 多继承5.5 赋值兼容原则5.6 程序举例5.7 本章小结第1页/共140页5.1继承与派生类5.1.1 为什么要使用继承5.1.2 派生类的声明5.1.3 基类成员在派生类中的访问属性5.1.4 派生类对基类成员的访问规则第2页/共140页5.1.1为什么要使用继承继承是自然界的一个普遍的重要特性。派生使新类在继承共性的同时,具有了更加丰富多彩的个性。第3页/共140页继承的层次结构面向对象程序设计的继承与派生机制是源于自然界中的概念。一般采用层次分类方法来描述
2、事物之间的关系。第4页/共140页简单的汽车分类图第5页/共140页类的层次结构关系总结类的层次结构图中,下层类是上层类的特殊类。下层类自动具有上层类的特性,同时也具有自身新的特性。越往层次结构图的下层,其特性越具体化这种从上到下的层次结构关系体现了继承与派生的过程。C+面向对象技术也采用了这种继承机制。第6页/共140页Persong类和Employee类classpersonprotected:charname10;intage;charsex;public:voidprint();classemployeeprotected:charname10;intage;charsex;chard
3、epartment20;floatsalary;public:voidprint();返回返回第7页/共140页5.1.2派生类的声明/定义一个基类classpersonprotected:charname10;intage;charsex;public:/;/定义一个派生类classemployee:publicpersonprotected:chardepartment20;floatsalary;public:/;第8页/共140页C+派生类的定义格式class派生类名:继承方式基类名派生类新定义的数据成员;派生类新定义的成员函数;第9页/共140页继承方式继承方式有三种:public
4、公有继承private 私有继承protected 保护继承缺省情况下表示private方式第10页/共140页由类person继承出类employee可以采用下面的三种格式之一:(1)公有继承classemployee:publicperson/;(2)私有继承classemployee:privateperson/;(3)保护继承classemployee:protectedperson/;第11页/共140页派生类的生成过程派生类的生成过程经历了三个步骤:吸收基类成员 改造基类成员 添加派生类新成员第12页/共140页吸收基类成员在C+的继承机制中,派生类吸收基类中除构造函数和析构函数之
5、外的全部成员。吸收基类成员是一个重用的过程,体现了代码的重用。第13页/共140页改造基类成员由于基类的部分成员在派生类中可能不需要却也被继承下来,对这些没有实际需要而被继承的成员,在派生类中需要对其进行改造。改造基类成员包括两个方面:(1)通过派生的三种继承方式来控制;(2)通过在派生类中定义同名成员(包括成员函数 和数据成员)来屏蔽在派生类中不起作用的部 分基类成员。第14页/共140页添加派生类新成员添加派生类的新成员是继承机制的核心内容。仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。返回返回第15页/共140页5.1.3基类成员在派生类中的
6、访问属性在基类中的访问属性继承方式在派生类中的访问属性privatepublic不可直接访问privateprivate不可直接访问privateprotected不可直接访问publicpublicpublicpublicprivateprivatepublicprotectedprotectedprotectedpublicprotectedprotectedprivateprivateprotectedprotectedprotected第16页/共140页三种继承方式的属性表公有成员私有成员保护成员公有继承公有不可访问保护私有继承私有不可访问私有保护继承保护不可访问保护继承方式继承方式
7、基类成员基类成员返回返回第17页/共140页5.1.4派生类对基类成员的访问规则派生类对基类成员的访问形式主要有以下两种:(1)内部访问:由派生类中新增成员对基类继承来的成员的访问。(2)对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。第18页/共140页1.私有继承的访问规则当类的继承方式为私有继承时,基类的public成员和protected成员被继承后作为派生类的private成员,派生类的其他成员可以直接访问它们,但是在类外部通过派生类的对象无法访问。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基
8、类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。第19页/共140页例5.1一个私有继承的例子#includeclassbase/声明一个基类public:voidsetx(intn)x=n;voidshowx()coutxendl;private:intx;第20页/共140页例5.1一个私有继承的例子classderived:privatebase/声明一个私有派生类public:voidsetxy(intn,intm)setx(n);/setx()在派生类中为private成员,派生类成员函数可以访问y=m;voidshowxy()coutx;/非法,在
9、派生类中不能直接访问基类的私有成员xcoutyendl;private:inty;showx();第21页/共140页例5.1一个私有继承的例子voidmain()derivedobj;obj.setx(10);/非法,setx()在派生类中为private成员,派生/类对象不能访问obj.showx();/非法,showx()在派生类中为private成员,派生/类对象不能访问obj.setxy(20,30);obj.showxy();base base_obj;base_obj.setx(10);base_obj.showx();第22页/共140页例5.2保护成员以私有方式继承后的访问属
10、性#includeclassbase/声明一个基类public:voidseta(intsa)a=sa;voidshowa()couta=aendl;protected:inta;第23页/共140页例5.2保护成员以私有方式继承后的访问属性classderive1:privatebase/声明一个私有派生类public:voidsetab(intsa,intsb)a=sa;b=sb;voidshowab()couta=aendl;coutb=bendl;protected:intb;第24页/共140页例5.2保护成员以私有方式继承后的访问属性classderive2:privatederi
11、ve1/声明一个私有派生类public:voidsetabc(intsa,intsb,intsc)setab(sa,sb);c=sc;voidshowabc()cout“a=”aendl;/非法,a在类derive2中为不可直接访/问成员coutb=bendl;/合法,b在类derive2中为private成员coutc=cendl;private:intc;若将其改为showa();呢?将其改为:void showabc()showab();cout“c=”cendl;第25页/共140页例5.2保护成员以私有方式继承后的访问属性voidmain()baseop1;op1.seta(1);o
12、p1.showa();derive1op2;op2.setab(2,3);op2.showab();derive2op3;op3.setabc(4,5,6);op3.showabc();第26页/共140页表5-2私有继承的访问规则基类成员private成员public成员protected成员内部访问对象访问不可访问不可访问可访问不可访问可访问不可访问第27页/共140页2.公有继承的访问规则当类的继承方式为公有继承时,基类的public成员和protected成员被继承到派生类中仍作为派生类的public成员和protected成员,派生类的其他成员可以直接访问它们。但是,类的外部使用者只
13、能通过派生类的对象访问继承来的public成员。基类的private成员在公有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问它们。第28页/共140页例5.3公有继承的访问规则#includeclassbase/声明一个基类public:voidsetxy(intm,intn)x=m;y=n;voidshowxy()coutx=xendl;couty=yendl;private:intx;protected:inty;第29页/共140页例5.3公有继承的访问规则classd
14、erived:publicbase/声明一个公有派生类public:voidsetxyz(intm,intn,intl)setxy(m,n);/setxy()在派生类中是public成员,可以访问z=l;voidshowxyz()coutx=xendl;/非法,x在类derived中为不可直接访问成员couty=yendl;/合法,y在类derived中为protected成员coutz=zendl;private:intz;showxy();第30页/共140页例5.3公有继承的访问规则voidmain()derivedobj;obj.setxyz(30,40,.50);obj.showxy
15、();/合法,showxy()在类derived中为public成员obj.showxyz();第31页/共140页表5-3公有继承的访问规则基类成员Private成员public成员protected成员内部访问对象访问不可访问不可访问可访问可访问可访问不可访问第32页/共140页3.保护继承的访问规则当类的继承方式为保护继承时,基类的public成员和protected成员被继承到派生类中都作为派生类的protected成员,派生类的其他成员可以直接访问它们,但是类的外部使用者不能通过派生类的对象来访问它们。基类的private成员在保护派生类中是不可直接访问的,所以无论是派生类成员还是通
16、过派生类的对象,都无法直接访问基类的private成员。第33页/共140页例5.4保护继承的访问规则#includeclassBase/声明一个基类public:intz;voidsetx(inti)x=i;intgetx()returnx;private:intx;protected:inty;第34页/共140页例5.4保护继承的访问规则classDerived:protectedBase/声明一个保护派生类public:intp;voidsetall(inta,intb,intc,intd,inte,intf);voidshow();private:intm;protected:int
17、n;第35页/共140页例5.4保护继承的访问规则voidDerived:setall(inta,intb,intc,intd,inte,intf)x=a;/非法,在类Derived中,x为不可直接访问成员y=b;/合法,y在类Derived中为protected成员z=c;/合法,z在类Derived中为protected成员m=d;n=e;p=f;setx(a);第36页/共140页例5.4保护继承的访问规则voidDerived:show()cout“x=”xendl;/非法,在类Derived中,/x为不可直接访问成员cout“x=”getx()endl;/合法,getx()在类Der
18、ived中/为protected成员couty=yendl;/合法,y在类Derived中为protected成员coutz=zendl;/合法,z在类Derived中为protected成员coutm=mendl;coutn=nendl;第37页/共140页例5.4保护继承的访问规则voidmain()Derivedobj;obj.setall(1,2,3,4,5,6);obj.show();coutp=obj.pendl;/合法,p在类Derived中为public成员第38页/共140页表5-4保护继承的访问规则基类成员private成员public成员protected成员内部访问对象
19、访问不可访问不可访问可访问不可访问可访问不可访问返回返回第39页/共140页5.2派生类的构造函数和析构函数基类的构造函数的功能是创建基类对象并进行初始化,而析构函数的功能在基类对象生存期结束时对基类对象进行必要的清理工作。在派生类的生成过程中,派生类将产生新的成员,对新增数据成员的初始化需要由派生类自身的构造函数完成,而对派生类对象的清理工作需要由相应的析构函数完成。第40页/共140页5.2派生类的构造函数和析构函数5.2.1 派生类构造函数和析构函数的执行顺序5.2.2 派生类构造函数和析构函数的构造规则第41页/共140页5.2.1派生类构造函数和析构函数的执行顺序通常情况下,当创建派
20、生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数。当撤消派生类对象时,则先执行派生类的析构函数,随后再执行基类的析构函数。第42页/共140页例5.5基类和派生类的构造函数及析构函数的执行顺序#includeclassBase public:Base()coutConstructingbaseclassn;/基类的构造函数Base()coutDestructingbaesclassn;/基类的析构函数;第43页/共140页例5.5基类和派生类的构造函数及析构函数的执行顺序classDerive:publicBasepublic:Derive()coutConstructingde
21、rivedclassn;/派生类的构造函数Derive()coutDestructingderivedclassn;/派生类的析构函数;voidmain()Deriveop;返回返回第44页/共140页5.2.2派生类构造函数和析构函数的构造规则当基类中没有显式定义构造函数时,派生类的构造函数定义可以省略,系统采用默认的构造函数。当基类定义了具有形参的构造函数时,派生类也必须定义构造函数,提供将参数传递给基类构造函数的途径,使基类对象在进行初始化时可以获得相关数据。第45页/共140页C+中派生类构造函数的一般格式派生类名(参数总表):基类名(参数表)/派生类新增成员的初始化语句第46页/共1
22、40页例5.6当基类含有带参数的构造函数时,派生类构造函数的构造方法。#includeclassBasepublic:Base(intn)/基类的构造函数coutConstructingbaseclassn;i=n;Base()/基类的析构函数coutDestructingbaseclassn;voidshowi()coutiendl;private:inti;第47页/共140页例5.6当基类含有带参数的构造函数时,派生类构造函数的构造方法。classDerive:publicBasepublic:Derive(intn,intm):Base(m)/定义派生类构造函数时,/缀上基类的构造函数
23、coutConstructingderivedclassendl;j=n;Derive()/派生类的析构函数coutDestructingderivedclassendl;voidshowj()coutjendl;private:intj;voidmain()Deriveobj(50,60);obj.showi();obj.showj();第48页/共140页当派生类中含有内嵌对象成员时,其构造函数的一般形式派生类名派生类名(参数总表参数总表):):基类名基类名(参数表参数表1),1),内嵌对象名内嵌对象名1(1(内嵌对象参数表内嵌对象参数表1),1),内嵌对象名内嵌对象名n(n(内嵌对象参数
24、表内嵌对象参数表n)n)/派生类新增成员的初始化语句派生类新增成员的初始化语句 第49页/共140页在定义派生类对象时,构造函数的执行顺序调用基类的构造函数调用基类的构造函数;调用内嵌对象成员的构造函数(有多个对象成员时调用内嵌对象成员的构造函数(有多个对象成员时,调用顺序由它们在类中声明调用顺序由它们在类中声明的顺序确定)的顺序确定);派生类的构造函数体中的内容。派生类的构造函数体中的内容。撤消对象时,析构函数的调用顺序与构造函数的调用顺序正好相反。第50页/共140页例5.7内嵌对象成员的例子#includeclassBasepublic:Base(inti)/基类的构造函数coutCon
25、structingbaseclassn;x=i;Base()/基类的析构函数coutDestructingbaseclassn;voidshow()coutx=xendl;private:intx;第51页/共140页例5.7内嵌对象成员的例子classDerive:publicBasepublic:Derive(inti):Base(i),d(i)/定义派生类构造函数时,/缀上基类的构造函数和对象成员构造函数coutConstructingderivedclassendl;Derive()/派生类的析构函数coutDestructingderivedclassendl;private:Bas
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 经济学 继承 派生
限制150内