第9-10讲 继承性和派生类_第1页
第9-10讲 继承性和派生类_第2页
第9-10讲 继承性和派生类_第3页
第9-10讲 继承性和派生类_第4页
第9-10讲 继承性和派生类_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第5章继承与派生类,5.1继承与派生类,1.为什么要使用继承?现实世界的许多事物具有继承性,例:,有类PersonclassPersonprotected:charname10;/姓名intage;/年龄charsex;/性别public:voidprint();,employee类,包含姓名name、年龄age、性别sex。还包含部门department、工资salary等数据成员与成员函数print()classemployeeprotected:charname10;/姓名intage;/年龄charsex;/性别chardepartment20;floatsalary;public

2、:voidprint();,减少代码的重复率,提高程序效率,classPersonprotected:charname10;/姓名intage;/年龄charsex;/性别public:voidprint();,classemployee:publicpersonprotected:chardepartment20;floatsalary;,通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。则称,已存在的用来派生新类的类为基类,由已存在的类派生出的新类称为派生类。一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基

3、类派生的继承称为单继承;从多个基类派生的继承称为多继承。,5.1.2派生类的声明,单继承的定义格式为:class派生类名:继承方式基类名派生类新定义成员;多继承的定义格式为:class派生类名:继承方式1基类名1,继承方式2基类名2,派生类新定义成员;,public:公有派生private:私有派生protected:保护派生,规定基类成员在派生类中的访问权限,图11.6,派生类成员的组成,voiddisplay_1();,从基类接收成员在声明派生类时增加的成员,classStudent1:publicStudent/声明基类是Studentpublic:voiddisplay_1()/新增加

4、的成员函数coutagetaddrendl;private:intage;/新增加的数据成员stringaddr;/新增加的数据成员;,#include#includeclassStudentprivate:intnum;char*name;charsex;public:Student(intnum1,char*name1,charsex1)num=num1;name=newcharstrlen(name1)+1;strcpy(name,name1);sex=sex1;voiddisplay()coutnumtnametsexendl;,classStudent1:publicStudenti

5、ntage;char*addr;public:Student1(intnum1,char*name1,charsex1,intage1,char*addr1):Student(num1,name1,sex1)age=age1;addr=newcharstrlen(addr1)+1;strcpy(addr,addr1);voiddisplay_1()coutagetaddrendl;voidmain()Student1s1(001,LiMing,f,19,1号楼);s1.display();s1.display_1();,继承方式:(1)公有继承classemployee:publicperso

6、n;(2)私有继承classemployee:privateperson;(3)保护继承classemployee:protectedperson;类的继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。默认继承方式:私有,5.1.3基类成员在派生类中的访问属性,派生类可以继承基类中除了构造函数与析构函数之外的全部成员,但是这些成员的访问属性在派生过程中是可以调整的。从基类继承来的成员在派生类中的访问属性是由继承方式控制的。基类成员在派生类中的访问属性见书143。(1)基类中的私有成员(private)无论哪种继承方式,基类中的私有成员不允许派生类继承,即在派生类中是不可直接

7、访问的。,基类的成员还是在派生类对象内真实存在的,只是派生类对象无法通过派生类的接口访问它,虽然基类中私有成员是派生类对象内存布局中得一个部分,但是对于派生类而言,他根本不知道有这个成员得存在。就好象骨头是你的身体的组成部分,但是你没有必要知道你有206块骨头,其中颈部有7块。你身体的组成部分的工作并不需要你知道的情况下才工作,(2)基类中的公有成员(public)A、当类的继承方式为公有(public)继承时,基类中的所有公有成员在派生类中仍以公有成员的身份出现的。B、当类的继承方式为私有(private)继承时,基类中的所有公有成员在派生类中都是以私有成员的身份出现。C、当类的继承方式为保

8、护(protected)继承时,基类中的所有公有成员在派生类中都是以保护成员的身份出现的。,(3)基类中的保护成员(protected)A、当类的继承方式为公有(public)继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现的。B、当类的继承方式为私有(private)继承时,基类中的所有保护成员在派生类中都是以私有成员的身份出现的。C、当类的继承方式为保护(protected)继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现的。,在讨论访问属性时,要考虑以下几种情况:,(1)基类的成员函数访问基类成员。(2)派生类的成员函数访问基类的成员。(3)基类的成员函数访问派生

9、类的成员。(4)派生类的成员函数访问派生类自己增加的成员。(5)在派生类外访问派生类的成员。(6)在派生类外访问基类的成员。,5.1.4派生类对基类成员的访问规则,派生类对基类成员的访问形式主要有以下2种(1)内部访问:由派生类中新增成员对基类继承来的成员的访问。(2)对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。下面具体讨论在3种继承方式下,派生类对基类成员的访问规则,1、私有继承的访问规则当类的继承方式为私有继承时,基类的public成员和protected成员被继承后作为派生类的private成员,派生类的其他成员可以直接访问它们,但是在类外部通过派生类的对象无法访

10、问。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。,/例5_1一个私有继承的例子#includeclassbase/声明一个基类public:voidsetx(intn)x=n;voidshowx()coutxendl;private:intx;classderived:privatebase/声明一个私有派生类public:voidsetxy(intn,intm)setx(n);/setx()在派生类中为private成员,派生类成员函数可以

11、访问y=m;voidshowxy()coutx;/非法,在派生类中不能直接访问基类的私有成员x/showx();coutyendl;private:inty;,voidmain()derivedobj;obj.setx(10);/非法,setx()在派生类中为private成员/派生类对象不能访问obj.showx();/非法obj.setxy(20,30);obj.showxy();,5_2保护成员以私有方式被继承后的访问属性#includeclassbase/声明一个基类public:voidseta(intsa)a=sa;voidshowa()couta=aendl;protected:

12、inta;classderive1:privatebase/声明一个私有派生类public:voidsetab(intsa,intsb)a=sa;b=sb;voidshowab()couta=aendl;coutb=bendl;protected:intb;,classderive2:privatederive1/声明一个私有派生类public:voidsetabc(intsa,intsb,intsc)setab(sa,sb);c=sc;voidshowabc()couta=aendl;/非法,a在类derived2中为不可直接访问成员/showa();/showab();coutb=bend

13、l;/合法,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();,公有继承的访问规则:当类的继承方式为公有继承时,基类的public成员和protdcted成员被继承到派生类中仍作为派生类的public成员和protected成员,派生类的其他成员可以直接访问它们。但是,类的外部使用者只能通过派生类的对象访问

14、继承来的public成员。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问它们。,5_3公有继承的访问规则#includeclassbase/声明一个基类public:voidsetxy(intm,intn)x=m;y=n;voidshowxy()coutx=xendl;couty=yendl;private:intx;protected:inty;,公有继承,classderived:publicbase/声明一个公有派生类public:voidse

15、txyz(intm,intn,intl)setxy(m,n);/setxy()在派生类中是public成员,可以访问z=l;/此处是字符lvoidshowxyz()/coutx=xendl;/非法,x在类derived中为不可直接访问成员showxy();/改成这样就行了。/couty=yendl;/合法,y在类derived中为protected成员coutz=zendl;private:intz;,main()derivedobj;obj.setxyz(30,40,50);obj.showxy();/合法,showxy()在类derived中为public成员obj.showxyz();r

16、eturn0;需要强调的是:派生类以公有方式继承了基类,但派生类也不可以访问基类的private成员。基类无论怎样被继承,它的私有成员对派生类而言都是不能直接访问的。见149页表5_3,保护继承的访问规则,当类的继承方式为保护继承时,基类的public成员和protected成员被继承到派生类中都作为派生类的protected成员,派生类的其他成员可以直接访问它们,但是类的外部使用者不能通过派生类的对象来访问它们。基类的private成员在私有派生类中是不可以直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类的private成员。,/例5_4保护继承的访问规则#inclu

17、declassbasepublic:intz;voidsetx(inti)x=i;intgetx()returnx;private:intx;protected:inty;,classderived:protectedbasepublic:intp;voidsetall(inta,intb,intc,intd,inte,intf);voidshow();private:intm;protected:intn;,voidderived:setall(inta,intb,intc,intd,inte,intf)/x=a;/非法,在类derived中,x为不可直接访问成员,可修改为setx(a);s

18、etx(a);/这样修改,用public的setx函数将a的值赋给xy=b;/合法,y在类derived中为protected成员z=c;/合法,z在类derived中为protected成员m=d;/可以访问自己的private的m成员n=e;/自己的protected的n成员p=f;/自己的public的p成员,voidderived:show()/coutx=xendl;/非法,在类derived中,x为不可直接访问成员coutx=getx()endl;/合法,getx()在类derived中为protected成员couty=yendl;/合法,y在类derived中为protecte

19、d成员coutz=zendl;/合法,z在类derived中为protected成员coutm=mendl;coutn=nendl;voidmain()derivedobj;obj.setall(1,2,3,4,5,6);obj.show();coutp=obj.pendl;/合法,p在类derived中为public成员/保护继承的访问规则见书150页表5_4,课后作业:友元与继承的关系classAfriendclassBclassBclassC:publicBC类的对象能否访问A类的成员函数静态成员与继承的关系类A的静态成员与他的派生类B有什么关系?,5.2派生类构造函数和析构函数,5.2

20、.1派生类构造函数和析构函数的执行顺序,派生类构造函数的调用顺序如下:基类的构造函数派生类构造函数注意:若有多个基类时,按照继承列表中的顺序从左向右调用析构函数的调用顺序和构造函数正好相反,#includeclassApublic:A()cout调用构造函数Aendl;A()cout调用析构函数Aendl;classBpublic:B()cout调用构造函数Bendl;B()cout调用析构函数Bendl;classC:publicA,publicBpublic:C()cout调用构造函数Cendl;C()cout调用析构函数Cendl;,调用构造函数A调用构造函数B调用构造函数C调用析构函数

21、C调用析构函数B调用析构函数A,voidmain()Cc1;,5.2.2派生类构造函数和析构函数的构造规则,派生类不能继承基类中的构造函数和析构函数。当基类含有带参数的构造函数时,派生类必须定义构造函数(基类不含参数,派生类可不带),以提供把参数传递给基类构造函数的途径。派生类名(参数总表):基类名(参数表)/派生类中新增数据成员初始化;,5_6当基类含有带参数的构造函数时,派生类构造函数的构造方法,#includeclassbasepublic:base(intn)cout基类的构造函数n;i=n;/m传过来是60base()cout基类的析构函数n;voidshowi()coutiendl

22、;private:inti;,classderive:publicbasepublic:derive(intn,intm):base(m)/定义派生类构造函数时缀上基类的构造函数cout派生类的构造函数endl;j=n;/n是50derive()cout派生类的析构函数endl;voidshowj()coutjendl;private:intj;voidmain()deriveobj(50,60);obj.showi();/输出基类的(m传给n)n是60obj.showj();/输出派生类的n是50,基类的构造函数派生类的构造函数6050派生类的析构函数基类的析构函数,含子对象的派生类构造函数

23、,一般格式为:派生类名(参数总表):基类名(参数表0),对象名1(参数表1),对象名2(参数表2),对象名n(参数表n)派生类中新增数据成员初始化;,派生类构造函数的调用顺序如下:基类的构造函数子对象类的构造函数(若有多个对象成员,调用顺序由他们在类中声明的顺序决定)派生类构造函数注:析构函数的调用顺序和构造函数正好相反,例5_7内嵌对象成员时派生类构造函数和析构函数的执行顺序#includeclassbaseintx;public:base(inti)x=i;cout基类构造函数n;base()cout基类的析构函数n;voidshow()coutx=xendl;classderived:p

24、ublicbasebased;/d为基类对象,作为派生类的对象成员public:derived(inti):base(i),d(i)cout派生类构造函数n;/派生类的构造函数,缀上基类构造函数和对象成员构造函数derived()cout派生类析构函数n;voidmain()derivedobj(123);obj.show();,基类构造函数基类构造函数派生类构造函数x=123派生类析构函数基类的析构函数基类的析构函数,说明:(1)当基类构造函数不带参数时,派生类不一定需要构造函数,然而当基类的构造函数哪怕只带有一个参数,它所有的派生类都必须定义构造函数。甚至所定义的派生类构造函数的函数体可能

25、为空,仅仅起参数的传递作用。(2)若基类使用缺省构造函数或不带参数的构造函数,则在派生类中定义构造函数时可略去“:基类构造函数名(参数表)”。此时若派生类也不需要构造函数,则可不定义构造函数。(3)如果派生类的基类也是一个派生类,每个派生类只需负责其直接基类的构造,依次上推。(4)由于析构函数是不带参数的,在派生类中是否要定义析构函数与它所属的基类无关,基类的析构函数不会因为派生类没有析构函数而得不到执行,它们是各自独立的。,/5_8说明派生类构造函数和析构函数的构造规则#includeclassfirstprivate:inta,b;public:first()a=0;b=0;first(i

26、ntx,inty)a=x;b=y;first()voidprint()coutna=atb=b;classsecond:publicfirstprivate:intc,d;public:second():first(1,1)/基类构造函数的参数可在派生类的构造函数中不给出c=0;d=0;second(intx,inty):first(x+1,y+1)/可以对派生类构造函数的参数c=x;d=y;/进行一些变换,再传递给基类的构造函数second(intx,inty,intm,intn):first(m,n)c=x;d=y;second()voidprint()first:print();cout

27、tc=ctd=d;,classthird:publicsecondprivate:inte;public:third()/派生类的构造函数可以不显示地写出基类的构造函数e=0;/此时系统调用基类的无参构造函数。third(intx,inty,intz):second(x,y)/系统自动调用基类的无参构造e=z;/函数,也可以显示地指出具体调用基类的哪一个构造函数third(intx,inty,intz,intm,intn):second(x,y,m,n)e=z;third()voidprint()second:print();coutte=e;voidmain()firstobj0;obj0.

28、print();secondobj1;obj1.print();secondobj2(10,10,20,20);obj2.print();secondobj3(10,10);obj3.print();thirdobj4;obj4.print();thirdobj5(10,10,20);obj5.print();thirdobj6(100,100,200,50,50);obj6.print();coutendl;,说明:(1)派生类的构造函数可以不显示地写出基类的构造函数如:third()e=0;此时,系统自动调用基类的无参构造函数(若类没有无参构造函数,则调用缺省的构造函数),也可以显示地指出

29、具体调用基类的哪一个构造函数如:third(intx,inty,intz):second(x,y)e=z;(2)基类构造函数的参数可以在派生类的构造函数中明确地给出,如:third(intx,inty,intz):second(x,y)e=z;也可以不给出,如:second():first(1,1)c=0;d=0;还可以对派生类构造函数的参数进行一些变换,再传给基类的构造函数,如:Second(intx,inty):first(x+1,y+1)c=x;d=y;,下面程序的运行结果为#includeclassApublic:A()cout”1”;A()cout”2”;classB:publicA

30、public:B()cout”3”;B()cout”4”;voidmain()Bb;A)1234B)1324C)1342D)3142,C)1342,5.3基类成员在派生类中的访问属性的其他方法,#includeclassApublic:voidf(inti)coutiendl;voidg()coutgn;classB:publicApublic:voidh()couthn;/voidf(inti,intj)coutitjendl;voidmain()Bd1;d1.f(6);/d1.f(3,4);d1.g();d1.h();,classApublic:voidf(inti)coutiendl;v

31、oidg()coutgn;classB:Apublic:voidh()couthn;A:f;,将基类的公有成员说明为派生类的公有成员,若改为:classB:publicA则结果为:6gh,不能被访问,voidmain()Bd1;d1.f(6);d1.g();d1.h();,若无该行结果为:6h,#includeclassApublic:A(intx1)x=x1;voidprint()coutx=xendl;private:intx;classB:Apublic:B(intx1,inty1):A(x1)y=y1;voidprint2()print();/A:print();/b.print();

32、/出错/A:print;/b.print();/OKprivate:inty;voidmain()Bb(10,20);b.print2();/b.print();,多继承的概念多继承的构造函数二义性问题,5.4多继承,是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。定义格式在开始已经给出。如:classA;classB;classC:publicA,publicB;根据继承的规定,派生类C的成员包含了基类A中成员和基类B中成员及该类本身的成员。,5.4.1多继承的概念,classz:publicx,y;类z公有继承了类x,私有继承了类yclassz:x,publicy;

33、类z私有继承了类x,公有继承了类yclassz:publicx,publicy;类z公有继承了类x和类y多继承中,公有继承和私有继承对于基类成员在派生类中的可访性与单继承的规则相同。,#includeclassApublic:voidsetA(intx)a=x;voidprintA()couta=aendl;private:inta;classBpublic:voidsetB(intx)b=x;voidprintB()coutb=bendl;private:intb;,例5_12多继承下的访问特性,classC:publicA,privateBpublic:voidsetC(intx,inty

34、)c=x;setB(y);voidprintC()printB();coutc=cendl;private:intc;voidmain()Cobj;obj.setA(3);obj.printA();obj.setB(4);/错误因为B的成员函数在C中已成为私有成员,不能直接访问obj.printB();/错误obj.setC(6,8);obj.printC();,5.4.2多继承的构造函数,一般格式为:():(),(),();它必须同时负责该派生类所有基类构造函数的调用。同时,派生类的参数个数必须包含完成所有基类初始化所需的参数个数。,派生类构造函数的调用顺序是:先执行所有基类的构造函数再执行

35、子对象类的构造函数(若有)再执行派生类本身的构造函数注意:同一层次的各基类构造函数的执行顺序取决于定义派生类时所指定的各基类顺序,与派生类构造函数中所定义的成员初始化表的各项顺序无关。,5.4.2多继承的构造函数,classB1public:B1(inti)b1=i;coutconB1.iendl;voidprint()coutb1endl;private:intb1;,classB2public:B2(inti)b2=i;coutconB2.iendl;voidprint()coutb2endl;private:intb2;,5.4.2多继承的构造函数,classB3public:B3(in

36、ti)b3=i;coutconB3.iendl;intgetb3()returnb3;private:intb3;,5.4.2多继承的构造函数,classA:publicB2,publicB1public:A(inti,intj,intk,intm):B1(i),B2(j),bb(k)a=m;coutconA.mendl;voidprint()B1:print();B2:print();couta,bb.getb3()endl;private:inta;B3bb;,运行结果:conB2.2conB1.1conB3.3conA.4124,3,voidmain()Aaa(1,2,3,4);aa.p

37、rint();,5.4.2多继承的构造函数,在多继承下,若多个基类在保护和公有部分用了相同的成员名,可能造成对基类中该成员的访问出现不是唯一的情况。称为对基类成员访问的二义性(ambiguous)。如在上例中,B1和B2都定义了print(),而同时被继承为派生类A的成员,由此就造成了二义性,因为当在aa中调用print()时无法确定调用哪一个基类的print()。Aaa;aa.print();/出错,print()具有二义性,5.4.3多继承时的二义性问题,61,(1)两个基类有同名成员,5.4.3多继承时的二义性问题,62,classApublic:inta;voiddisplay();c

38、lassBpublic:inta;voiddisplay();,classC:publicA,publicBpublic:intb;voidshow();Voidmain()Cc1;c1.a=3;c1.display();,5.4.3多继承时的二义性问题,63,5.4.3多继承时的二义性问题,消除二义性有两种方法:1、使用相应的类名来标识c1.A:display();2、由派生类提供统一的界面voidC:display()A:display();B:display();,5.4.3多继承时的二义性问题,65,将C类声明改为:classC:publicA,publicBinta;voiddisp

39、lay();,(2)两个基类和派生类三者都有同名成员。,voidmain()Cc1;c1.a=3;c1.display();,会有问题么?,5.4.3多继承时的二义性问题,66,规则:基类的同名成员在派生类中被屏蔽,成为“不可见”的,或者说,派生类新增加的同名成员覆盖了基类中的同名成员。因此如果在定义派生类对象的模块中通过对象名访问同名的成员,则访问的是派生类的成员。,请注意:不同的成员函数,只有在函数名和参数个数相同、类型相匹配的情况下才发生同名覆盖,如果只有函数名相同而参数不同,不会发生同名覆盖,而属于函数重载。,5.4.3多继承时的二义性问题,(3)如果C从类A和B派生,而它们又从同一个

40、基类派生,5.4.3多继承时的二义性问题,68,#includeclassNpublic:inta;voiddisplay()coutA:a=aendl;classA:publicNpublic:inta1;classB:publicNpublic:inta2;,classC:publicA,publicBpublic:inta3;voidshow()couta3=a3endl;voidmain()Cc1;/定义C类对象c1c1.a=2;c1.display();,5.4.3多继承时的二义性问题,69,5.4.3多继承时的二义性问题,70,显然不能用c1.a=3;c1.display();或c

41、1.N:a=3;c1.N:display();因为这样依然无法区别是类A中从基类N继承下来的成员,还是类B中从基类N继承下来的成员。,怎样才能访问类A中从基类N继承下来的成员呢?,应当通过类N的直接派生类名来指出要访问的是类N的哪一个派生类中的基类成员。如c1.A:a=3;c1.A:display();,5.4.3多继承时的二义性问题,5虚基类,虚基类的引入和说明虚基类的构造函数,72,5.1虚基类的作用,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员;引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免

42、产生二义性,使其惟一地标识一个成员;在一个类中保留间接共同基类的多份同名成员,是人们不希望的;C+提供虚基类(VirtualBaseClass)的方法,使得在继承间接共同基类时只保留一份成员。,#includeclassbasepublic:base()a=5;coutbasea=aendl;protected:inta;classbase1:publicbasepublic:base1()a=a+10;coutbase1a=aendl;,例5_14虚基类的引例,classbase2:publicbasepublic:base2()a=a+20;coutbase2a=aendl;classde

43、rived:publicbase1,publicbase2public:derived()coutbase1:a=base1:aendl;coutbase2:a=base2:aendl;main()derivedobj;return0;,75,5.1虚基类的作用,若只想使公共基类在派生类中只产生一个基类子对象,则必须将该基类设定为虚基类。其真正目的是为了解决二义性问题。,5.1虚基类的作用,说明格式为:class派生类名:virtual继承方式基类名;,77,将类A声明为虚基类,方法如下:classA/声明基类A;classB:virtualpublicA;/声明类B是类A的公用派生类,A是B

44、的虚基类classC:virtualpublicA;,注意:虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。,5.2虚基类的声明,78,5.2虚基类的声明,classApublic:inta;classB1:virtualpublicAprivate:intb1;classB2:virtualpublicAprivate:intb2;classC:publicB1,publicB2public:intf();private:intc;则:c1.a;c1.A:a;c1.B1:a;c1.B2:a;,ab1b2c,ab1ab2c,5.2虚基类的声明,#includeclas

45、sbasepublic:base()a=5;coutbasea=aendl;protected:inta;classbase1:virtualpublicbasepublic:base1()a=a+10;coutbase1a=aendl;,例5_15虚基类的使用,classbase2:virtualpublicbasepublic:base2()a=a+20;coutbase2a=aendl;classderived:publicbase1,publicbase2public:derived()coutderiveda=aendl;main()derivedobj;return0;,5.2虚基

46、类的声明,83,如果在虚基类中定义了带参数的构造函数,而且没有定义默认构造函数,则在其所有派生类(包括直接派生或间接派生的派生类)中,通过构造函数的初始化表对虚基类进行初始化。,5.3虚基类的初始化,84,5.3虚基类的初始化,classA/定义基类AA(inti)/基类构造函数,有一个参数;classB:virtualpublicAB(intn):A(n)/初始化表中对虚基类初始化;classC:virtualpublicAC(intn):A(n)/初始化表中对虚基类初始化;classD:publicB,publicC/初始化表中对所有基类初始化D(intn):A(n),B(n),C(n);,为保证虚基类子对象只被初始化一次,这个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论