您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 第9-10讲 继承性和派生类
1第5章继承与派生类25.1继承与派生类1.为什么要使用继承?现实世界的许多事物具有继承性汽车运输汽车专用汽车消防车客车货车酒水车3学生中学生大学生专科生初中生高中生本科生小学生研究生硕士生博士生4例:有类PersonclassPerson{protected:charname[10];//姓名intage;//年龄charsex;//性别public:voidprint();};employee类,包含姓名name、年龄age、性别sex。还包含部门department、工资salary等数据成员与成员函数print()classemployee{protected:charname[10];//姓名intage;//年龄charsex;//性别chardepartment[20];floatsalary;public:voidprint();}减少代码的重复率,提高程序效率5classPerson{protected:charname[10];//姓名intage;//年龄charsex;//性别public:voidprint();};classemployee:publicperson{protected:chardepartment[20];floatsalary;}6通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。则称,已存在的用来派生新类的类为基类,由已存在的类派生出的新类称为派生类。一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。汽车运输汽车专用汽车消防车客车货车酒水车75.1.2派生类的声明单继承的定义格式为:class派生类名:继承方式基类名{派生类新定义成员};多继承的定义格式为:class派生类名:继承方式1基类名1,继承方式2基类名2,…{派生类新定义成员};public:公有派生private:私有派生protected:保护派生规定基类成员在派生类中的访问权限8图11.6派生类成员的组成voiddisplay_1();(1)从基类接收成员(2)在声明派生类时增加的成员9classStudent1:publicStudent//声明基类是Student{public:voiddisplay_1()//新增加的成员函数{coutage\taddrendl;}private:intage;//新增加的数据成员stringaddr;//新增加的数据成员};12继承方式:(1)公有继承classemployee:publicperson{};(2)私有继承classemployee:privateperson{};(3)保护继承classemployee:protectedperson{};类的继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。默认继承方式:私有135.1.3基类成员在派生类中的访问属性派生类可以继承基类中除了构造函数与析构函数之外的全部成员,但是这些成员的访问属性在派生过程中是可以调整的。从基类继承来的成员在派生类中的访问属性是由继承方式控制的。基类成员在派生类中的访问属性见书143。(1)基类中的私有成员(private)无论哪种继承方式,基类中的私有成员不允许派生类继承,即在派生类中是不可直接访问的。基类的成员还是在派生类对象内真实存在的,只是派生类对象无法通过派生类的接口访问它虽然基类中私有成员是派生类对象内存布局中得一个部分,但是对于派生类而言,他根本不知道有这个成员得存在。就好象骨头是你的身体的组成部分,但是你没有必要知道你有206块骨头,其中颈部有7块。你身体的组成部分的工作并不需要你知道的情况下才工作14(2)基类中的公有成员(public)A、当类的继承方式为公有(public)继承时,基类中的所有公有成员在派生类中仍以公有成员的身份出现的。B、当类的继承方式为私有(private)继承时,基类中的所有公有成员在派生类中都是以私有成员的身份出现。C、当类的继承方式为保护(protected)继承时,基类中的所有公有成员在派生类中都是以保护成员的身份出现的。15(3)基类中的保护成员(protected)A、当类的继承方式为公有(public)继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现的。B、当类的继承方式为私有(private)继承时,基类中的所有保护成员在派生类中都是以私有成员的身份出现的。C、当类的继承方式为保护(protected)继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现的。16在讨论访问属性时,要考虑以下几种情况:(1)基类的成员函数访问基类成员。(2)派生类的成员函数访问基类的成员。(3)基类的成员函数访问派生类的成员。(4)派生类的成员函数访问派生类自己增加的成员。(5)在派生类外访问派生类的成员。(6)在派生类外访问基类的成员。175.1.4派生类对基类成员的访问规则派生类对基类成员的访问形式主要有以下2种(1)内部访问:由派生类中新增成员对基类继承来的成员的访问。(2)对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。下面具体讨论在3种继承方式下,派生类对基类成员的访问规则18[1]、私有继承的访问规则当类的继承方式为私有继承时,基类的public成员和protected成员被继承后作为派生类的private成员,派生类的其他成员可以直接访问它们,但是在类外部通过派生类的对象无法访问。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。19//[例5_1]一个私有继承的例子#includeiostream.hclassbase//声明一个基类{public:voidsetx(intn){x=n;}voidshowx(){coutxendl;}private:intx;};classderived:privatebase//声明一个私有派生类{public:voidsetxy(intn,intm){setx(n);//setx()在派生类中为private成员,派生类成员函数可以访问y=m;}voidshowxy(){coutx;//非法,在派生类中不能直接访问基类的私有成员x//showx();coutyendl;}private:inty;};20voidmain(){derivedobj;obj.setx(10);//非法,setx()在派生类中为private成员//派生类对象不能访问obj.showx();//非法obj.setxy(20,30);obj.showxy();}21[5_2]保护成员以私有方式被继承后的访问属性#includeiostream.hclassbase//声明一个基类{public:voidseta(intsa){a=sa;}voidshowa(){couta=aendl;}protected:inta;};classderive1:privatebase//声明一个私有派生类{public:voidsetab(intsa,intsb){a=sa;b=sb;}voidshowab(){couta=aendl;coutb=bendl;}protected:intb;};22classderive2:privatederive1//声明一个私有派生类{public:voidsetabc(intsa,intsb,intsc){setab(sa,sb);c=sc;}voidshowabc(){couta=aendl;//非法,a在类derived2中为不可直接访问成员//showa();//showab();coutb=bendl;//合法,b在类derived2中为private成员coutc=cendl;}private:intc;};voidmain(){baseop1;op1.seta(1);op1.showa();derivelop2;op2.setab(2,3);op2.showab();derive2op3;op3.setabc(4,5,6);op3.showabc();}23公有继承的访问规则:当类的继承方式为公有继承时,基类的public成员和protdcted成员被继承到派生类中仍作为派生类的public成员和protected成员,派生类的其他成员可以直接访问它们。但是,类的外部使用者只能通过派生类的对象访问继承来的public成员。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问它们。24[5_3]公有继承的访问规则#includeiostream.hclassbase//声明一个基类{public:voidsetxy(intm,intn){x=m;y=n;}voidshowxy(){coutx=xendl;couty=yendl;}private:intx;protected:inty;};公有继承25classderived:publicbase//声明一个公有派生类{public:voidsetxyz(intm,intn,intl){setxy(m,n);//setxy()在派生类中是public成员,可以访问z=l;//此处是字符l}voidshowxyz(){//coutx=xendl;//非法,x在类derived中为不可直接访问成员showxy();//改成这样就行了。//couty=yendl;//合法,y在类derived中为protected成员coutz=zendl;}private:intz;};26main(){derivedobj;obj.setxyz(30,40,50);obj.showxy();//合法,showxy()在类derived中为public成员obj.showxyz();return0;}需要强调的是:派生类以公有方式继承了基类,但派生类也不可以访问基类的private成员。基类无论怎样被继承,它的私有成员对派生类而言都是不能直接访问的。见149页表5_327保护继承的访问规则当类的继承方式为保护继承时,基类的public成员和protected成员被继承到派生类中都作为派生类的protected成员,派生类的其他成员可以直接访问它们,但是类的外部使用者不能通过派生类的对象来访问它们。基类的private成员在私有派生类中是不可以直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类的private成员。28//[例5_4]保护继承的访问规则#includeiostream.hclassbase{public:intz;voidsetx(inti){x=i;}intgetx(){returnx;}private:intx;protected:inty;};29classderived:protectedbase{public:intp;voidsetall(inta,intb,intc,intd,inte,intf);voidshow();private:intm;protected:intn;};30voidderived::setall(inta,int
本文标题:第9-10讲 继承性和派生类
链接地址:https://www.777doc.com/doc-3367756 .html