《派生类与继承》PPT课件.ppt
第第4章章派生类与继承派生类与继承1/12/20231面向对象程序设计技术4.1继承与派生类继承与派生类u4.1.1为什么要使用继承为什么要使用继承l l重用:通过继承机制,利用已有的类来定义新类,重用:通过继承机制,利用已有的类来定义新类,重用:通过继承机制,利用已有的类来定义新类,重用:通过继承机制,利用已有的类来定义新类,新的类不仅可以有新的成员,还拥有从已有的类继新的类不仅可以有新的成员,还拥有从已有的类继新的类不仅可以有新的成员,还拥有从已有的类继新的类不仅可以有新的成员,还拥有从已有的类继承来的成员。承来的成员。承来的成员。承来的成员。l l已有的类称为已有的类称为已有的类称为已有的类称为基类基类基类基类或或或或父类父类父类父类,新的类称为,新的类称为,新的类称为,新的类称为派生类派生类派生类派生类或或或或子子子子类类类类。如果派生类从一个基类派生的,称这种继承为如果派生类从一个基类派生的,称这种继承为如果派生类从一个基类派生的,称这种继承为如果派生类从一个基类派生的,称这种继承为单继承单继承单继承单继承;如果派生类从多个基类派生的,称这种继;如果派生类从多个基类派生的,称这种继;如果派生类从多个基类派生的,称这种继;如果派生类从多个基类派生的,称这种继承为承为承为承为多继承多继承多继承多继承。4.1继承与派生类继承与派生类单继承单继承4.1继承与派生类继承与派生类多继承多继承4.1继承与派生类继承与派生类u4.1.2派生类的声明派生类的声明如果不采用派生类方法如果不采用派生类方法class person class person protected:protected:char name10;char name10;int age;int age;char sex;char sex;public:public:void print();void print();class employee protected:char name10;int age;char sex;char department20;float salary;public:print();重复书写!重复书写!4.1继承与派生类继承与派生类l l改写改写改写改写/定义一个基类定义一个基类定义一个基类定义一个基类classclasspersonperson protected:protected:charname10;charname10;intage;intage;charsex;charsex;public:public:/;/定义一个派生类定义一个派生类定义一个派生类定义一个派生类classemployee:classemployee:publicpublic personperson protected:protected:chardepartment20;chardepartment20;floatsalary;floatsalary;public:public:/;4.1继承与派生类继承与派生类l声明一个派生类的一般格式为声明一个派生类的一般格式为:class派生类名派生类名:继承方式继承方式基类名基类名派生类新定义成员派生类新定义成员;其中,其中,继承方式继承方式有有3种种:public(公有派生)(公有派生)、private(私有派生,缺省情况下也如此(私有派生,缺省情况下也如此)、protected(保护派生)。(保护派生)。由类由类由类由类personperson继承出类继承出类继承出类继承出类employeeemployee可以采用下面的三种可以采用下面的三种可以采用下面的三种可以采用下面的三种格式之一格式之一格式之一格式之一:(1)(1)公有继承公有继承公有继承公有继承 classemployee:publicpersonclassemployee:publicperson/;(2)(2)私有继承私有继承私有继承私有继承classemployee:privatepersonclassemployee:privateperson/;(3)(3)保护继承保护继承保护继承保护继承classemployee:protectedpersonclassemployee:protectedperson/;4.1继承与派生类继承与派生类l派生类的派生类的变异功能变异功能从已有类派生出新类时,可以在派生类内从已有类派生出新类时,可以在派生类内完成以下几种功能完成以下几种功能:(1)可以增加新的数据成员可以增加新的数据成员;(2)可以增加新的成员函数可以增加新的成员函数;(3)可以重新定义基类中已有的成员函数可以重新定义基类中已有的成员函数;(4)可以改变现有成员的属性。可以改变现有成员的属性。4.1继承与派生类继承与派生类u4.1.3基类成员在派生类中的访问属性基类成员在派生类中的访问属性在基类中的访问属性在基类中的访问属性继承方式继承方式在派生类中的访问属性在派生类中的访问属性privatepublic不可直接访问不可直接访问privateprivate不可直接访问不可直接访问privateprotected不可直接访问不可直接访问publicpublicpublicpublicprivateprivatepublicprotectedprotectedprotectedpublicprotectedprotectedprivateprivateprotectedprotectedprotected4.1继承与派生类继承与派生类不不可可见见可可见见可可见见u4.1.4派生类对基类成员的访问规则派生类对基类成员的访问规则派生类对基类成员的访问形式主要有以派生类对基类成员的访问形式主要有以下两种下两种:(1)内部访问内部访问:由派生类中新增成员对基类由派生类中新增成员对基类继承来的成员的访问。继承来的成员的访问。(2)对象访问对象访问:在派生类外部在派生类外部,通过派生类的通过派生类的对象对从基类继承来的成员的访问。对象对从基类继承来的成员的访问。4.1继承与派生类继承与派生类l私有继承的访问规则私有继承的访问规则基基基基类类类类的的的的publicpublic成成成成员员员员和和和和protectedprotected成成成成员员员员被被被被继继继继承承承承后后后后作作作作为为为为派派派派生生生生类类类类的的的的privateprivate成成成成员员员员,派派派派生生生生类类类类的的的的其其其其他他他他成成成成员员员员可可可可以以以以直直直直接接接接访访访访问问问问它它它它们们们们,但但但但是是是是在在在在类类类类外外外外部部部部通通通通过过过过派派派派生生生生类类类类的的的的对对对对象象象象无无无无法访问。法访问。法访问。法访问。基类的基类的基类的基类的privateprivate成员成员成员成员在私有派生类中是在私有派生类中是在私有派生类中是在私有派生类中是不可直接访不可直接访不可直接访不可直接访问问问问的,所以无论是派生类成员还是通过派生类的的,所以无论是派生类成员还是通过派生类的的,所以无论是派生类成员还是通过派生类的的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的对象,都无法直接访问从基类继承来的对象,都无法直接访问从基类继承来的对象,都无法直接访问从基类继承来的privateprivate成成成成员,但是可以通过基类提供的员,但是可以通过基类提供的员,但是可以通过基类提供的员,但是可以通过基类提供的publicpublic成员函数间成员函数间成员函数间成员函数间接访问。接访问。接访问。接访问。4.1继承与派生类继承与派生类基类成员基类成员private成员成员public成员成员protected成员成员内部访问内部访问对象访问对象访问不可访问不可访问不可访问不可访问可访问可访问不可访问不可访问可访问可访问不可访问不可访问classfathclassfathpublic:public:intainta,b b;intgetx()returnX;intgetx()returnX;intgety()returnY;intgety()returnY;protectedprotected:intcintc,d d;private:private:intX,Y;intX,Y;说明:class son:private fath int W,H;pubulic:void large();等价于等价于classson/classson/public:public:/voidlarge();voidlarge();protectedprotected:private:private:/intW,H;intW,H;intainta,b b;intgetx()returnX;intgetx()returnX;intgety()returnY;intgety()returnY;intcintc,d d;fatherprivate:fatherprivate:intX,Y;intX,Y;son:son1;son1 可以访问large()son1.large 可以访问 除了X、Y以外的任 何成员4.1继承与派生类继承与派生类l l例例例例4.14.1一个私有继承的例子一个私有继承的例子一个私有继承的例子一个私有继承的例子#includeiostream.h#includeiostream.hclassclassx xinta;inta;public:public:x()a=12;x()a=12;intget()returna;intget()returna;voidprint()coutaendl;voidprint()coutaendl;classclassy y:x x/私有继承私有继承私有继承私有继承intb;intb;/4.1继承与派生类继承与派生类public:public:voidmake()voidmake()b=get()+10b=get()+10;/;/调用了基类的成员调用了基类的成员调用了基类的成员调用了基类的成员voidprint()voidprint()x:print();x:print();coutbendl;coutbendl;voidmain()voidmain()xx1;classyy1;xx1;classyy1;y1.make();y1.make();y1.get();y1.get();/错误错误错误错误 x1.get();/x1.get();/对对对对 y1.print();/y1.print();/输出输出输出输出12221222 4.1继承与派生类继承与派生类l改变继承访问规则改变继承访问规则若希望基类中某些若希望基类中某些若希望基类中某些若希望基类中某些公有成员公有成员公有成员公有成员在派生类中也是在派生类中也是在派生类中也是在派生类中也是公有公有公有公有的的的的,使派生类的使用者能访问它,则可在派生类,使派生类的使用者能访问它,则可在派生类,使派生类的使用者能访问它,则可在派生类,使派生类的使用者能访问它,则可在派生类的公有段说明这些成员,说明的格式为:的公有段说明这些成员,说明的格式为:的公有段说明这些成员,说明的格式为:的公有段说明这些成员,说明的格式为:基类名基类名基类名基类名:成员名成员名成员名成员名;例例例例 classclassx xinta;inta;public:public:intb;x()a=12;b=11;intb;x()a=12;b=11;intget()returna;intget()returna;voidprint()coutaendl;voidprint()coutaendl;classclassy y:x x/私有继承私有继承私有继承私有继承/4.1继承与派生类继承与派生类public:public:voidmake()b=get()+10;/voidmake()b=get()+10;/调用了基类的成员调用了基类的成员调用了基类的成员调用了基类的成员 voidprint()x:print();coutbendl;voidprint()x:print();coutbendl;x:get;x:get;/x/x类中的类中的类中的类中的getget函数函数函数函数 x:b;x:b;/x/x类中的数据成员类中的数据成员类中的数据成员类中的数据成员bb;voidmain()voidmain()classxx1;classyy1;y1.make();classxx1;classyy1;y1.make();coutcouty1.get()y1.get()y1.by1.bendl;/endl;/正确正确正确正确 x1.get();x1.get();/对对对对 y1.print();/y1.print();/输出输出输出输出12221222 4.1继承与派生类继承与派生类通过通过通过通过访问声明访问声明访问声明访问声明调整访问域调整访问域调整访问域调整访问域 访问声明访问声明访问声明访问声明仅仅调整名字的访问仅仅调整名字的访问仅仅调整名字的访问仅仅调整名字的访问,不可为它说明任何类型;若名不可为它说明任何类型;若名不可为它说明任何类型;若名不可为它说明任何类型;若名字为成员函数,在访问声明时,字为成员函数,在访问声明时,字为成员函数,在访问声明时,字为成员函数,在访问声明时,也不准说明任何参数。也不准说明任何参数。也不准说明任何参数。也不准说明任何参数。访问声明访问声明访问声明访问声明只能调整基类的保护只能调整基类的保护只能调整基类的保护只能调整基类的保护段和公有段成员段和公有段成员段和公有段成员段和公有段成员在派生类中的在派生类中的在派生类中的在派生类中的访问域。访问域。访问域。访问域。不允许不允许不允许不允许在派生类中在派生类中在派生类中在派生类中降低或提升降低或提升降低或提升降低或提升基类成员的可访问性基类成员的可访问性基类成员的可访问性基类成员的可访问性。基类的。基类的。基类的。基类的保护段成员只在派生类中的保保护段成员只在派生类中的保保护段成员只在派生类中的保保护段成员只在派生类中的保护段中进行访问声明;基类的护段中进行访问声明;基类的护段中进行访问声明;基类的护段中进行访问声明;基类的公有段成员只能在派生类的公公有段成员只能在派生类的公公有段成员只能在派生类的公公有段成员只能在派生类的公有段中进行声明。有段中进行声明。有段中进行声明。有段中进行声明。classclassx xinta;inta;protected:protected:intint b b;public:public:intc;intc;classy:classy:x x pulic:pulic:x:b;x:b;/error/error protected:protected:x:c;x:c;/error/error;4.1继承与派生类继承与派生类对对对对重载函数的访问声明重载函数的访问声明重载函数的访问声明重载函数的访问声明将调整基类中具有该名将调整基类中具有该名将调整基类中具有该名将调整基类中具有该名的所有函数的访问域。的所有函数的访问域。的所有函数的访问域。的所有函数的访问域。classxclassxpublic:public:f();f();f(intf(inta);a);f(charf(char*p);*p);.classclass y:xy:x .pulicpulic:x:fx:f;.;4.1继承与派生类继承与派生类若若若若派生类中具有与基类同名的函数派生类中具有与基类同名的函数派生类中具有与基类同名的函数派生类中具有与基类同名的函数,则基类中的此函数,则基类中的此函数,则基类中的此函数,则基类中的此函数不能在派生类中进行访问声明。不能在派生类中进行访问声明。不能在派生类中进行访问声明。不能在派生类中进行访问声明。classxclassxpublic:public:f();f();f(intf(inta);a);f(charf(char*p);*p);.classclassy:xy:x public:public:voidvoidf(intf(ints);s);x:fx:f;/error/error;l公有继承的访问规则公有继承的访问规则基基基基类类类类的的的的publicpublic成成成成员员员员和和和和protectedprotected成成成成员员员员被被被被继继继继承承承承到到到到派派派派生生生生类类类类中中中中仍仍仍仍作作作作为为为为派派派派生生生生类类类类的的的的publicpublic成成成成员员员员和和和和protectedprotected成成成成员员员员,派派派派生生生生类类类类的的的的其其其其他他他他成成成成员员员员可可可可以以以以直直直直接接接接访访访访问问问问它它它它们们们们。但但但但是是是是,类类类类的的的的外外外外部部部部使使使使用用用用者者者者只只只只能能能能通通通通过过过过派派派派生生生生类的对象访问继承来的类的对象访问继承来的类的对象访问继承来的类的对象访问继承来的publicpublic成员。成员。成员。成员。基类的基类的基类的基类的privateprivate成员成员成员成员在私有派生类中是不可直接访问的,所在私有派生类中是不可直接访问的,所在私有派生类中是不可直接访问的,所在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都以无论是派生类成员还是通过派生类的对象,都以无论是派生类成员还是通过派生类的对象,都以无论是派生类成员还是通过派生类的对象,都无法直接无法直接无法直接无法直接访问访问访问访问从基类继承来的从基类继承来的从基类继承来的从基类继承来的privateprivate成员,但是可以通过基类提供成员,但是可以通过基类提供成员,但是可以通过基类提供成员,但是可以通过基类提供的的的的publicpublic成员函数间接访问它们。成员函数间接访问它们。成员函数间接访问它们。成员函数间接访问它们。4.1继承与派生类继承与派生类基类成员基类成员Private成员成员public成员成员protected成员成员内部访问内部访问对象访问对象访问不可访问不可访问不可访问不可访问可访问可访问可访问可访问可访问可访问不可访问不可访问classfathclassfathpublic:public:intainta,b b;intgetx()returnX;intgetx()returnX;intgety()returnY;intgety()returnY;protectedprotected:intcintc,d d;private:private:intX,Y;intX,Y;说明:class son:public fath int W,H;pubulic:void large();等价于等价于classson/classson/public:public:/intainta,b b;intgetx()returnX;intgetx()returnX;intgety()returnY;intgety()returnY;voidlarge();voidlarge();protectedprotected:intcintc,d d;private:private:/intW,H;intW,H;fatherprivate:fatherprivate:intX,Y;intX,Y;son:son1;son1 可以访问a、b、getx()、gety()、large()son1.large 可以访问 除了X、Y以外的任 何成员4.1继承与派生类继承与派生类l l例例例例4.34.3公有继承的访问规则公有继承的访问规则公有继承的访问规则公有继承的访问规则#includeiostream.h#includeiostream.hclassclassbasebaseintx1,x2;intx1,x2;public:public:voidassign(intp1,intp2)x1=p1;x2=p2;voidassign(intp1,intp2)x1=p1;x2=p2;intinc1()x1+;returnx1;intinc1()x1+;returnx1;intinc2()x2+;returnx2;intinc2()x2+;returnx2;voiddisplay()coutx1x2endl;voiddisplay()coutx1x2endl;classclassderive1derive1:base:baseintx3;intx3;public:public:derive1(intp3)x3=p3;derive1(intp3)x3=p3;4.1继承与派生类继承与派生类voidassign(intp1,intp2)voidassign(intp1,intp2)base:base:assign(p1,p2);assign(p1,p2);intinc1()returnintinc1()returnbase:base:inc1();inc1();intinc2()returnintinc2()returnbase:base:inc2();inc2();intinc3()x3+;returnx3;intinc3()x3+;returnx3;voiddisplay()voiddisplay()base:base:display();coutx3endl;display();coutx3endl;classderive2:classderive2:publicpublic basebaseintx4;intx4;public:public:derive2(intp4)x4=p4;derive2(intp4)x4=p4;intinc1()intinc1()inttemp=inttemp=base:base:inc1();temp=inc1();temp=base:base:inc1();inc1();temp=temp=base:base:inc1();returninc1();returnbase:base:inc1();inc1();/相当于相当于相当于相当于x1=x1+4;x1=x1+4;解解决决私私有有派派生生情情况况的的对对外外可可见见问问题题4.1继承与派生类继承与派生类intinc4()x4+;returnx4;intinc4()x4+;returnx4;voiddisplay()voiddisplay()base:base:display();coutx4endl;display();coutx4endl;intmain()intmain()basep;p.assign(-2,-2);basep;p.assign(-2,-2);coutbase-:n;coutbase-:n;p.display();p.display();/-2-2/-2-2 derive1d1(-4);d1.assign(10,10);derive1d1(-4);d1.assign(10,10);coutnderive1-:n;coutnderive1-:n;d1.display();d1.display();/x1=10 x2=10 x3=-4/x1=10 x2=10 x3=-4 d1.inc1();d1.inc2();d1.inc3();d1.inc1();d1.inc2();d1.inc3();coutnderive1-2-:n;coutnderive1-2-:n;4.1继承与派生类继承与派生类d1.display();d1.display();/x1=11x2=11x3=-3/x1=11x2=11x3=-3derive2d2(5);derive2d2(5);d2.assign(-11,-12);d2.assign(-11,-12);/调用基类成员函数调用基类成员函数调用基类成员函数调用基类成员函数coutnderive2-:n;coutnderive2-:n;d2.display();d2.display();/x1=-11x2=-12x4=5/x1=-11x2=-12x4=5d2.inc1();d2.inc1();/对对对对x14x14次加次加次加次加1x1=-71x1=-7d2.inc4();d2.inc4();/x4=6/x4=6 coutnderive2-:n;coutnderive2-:n;d2.display();d2.display();/x1=-7x2=-12x4=6/x1=-7x2=-12x4=6 d2.d2.base:base:inc1();inc1();/x1=-6/x1=-6coutnderive2-:n;d2.display();coutnderive2-:n;d2.display();return0;return0;l保护继承的访问规则保护继承的访问规则基基基基类类类类的的的的publicpublicpublicpublic成成成成员员员员和和和和protectedprotectedprotectedprotected成成成成员员员员被被被被继继继继承承承承到到到到派派派派生生生生类类类类中中中中都都都都作作作作为为为为派派派派生生生生类类类类的的的的protectedprotectedprotectedprotected成成成成员员员员,派派派派生生生生类类类类的的的的其其其其他他他他成成成成员员员员可可可可以以以以直直直直接接接接访访访访问问问问它它它它们们们们,但但但但是是是是类类类类的的的的外外外外部部部部使使使使用者不能通过派生类的对象来访问它们。用者不能通过派生类的对象来访问它们。用者不能通过派生类的对象来访问它们。用者不能通过派生类的对象来访问它们。基类的基类的基类的基类的privateprivateprivateprivate成员成员成员成员在私有派生类中是在私有派生类中是在私有派生类中是在私有派生类中是不可直接不可直接不可直接不可直接访问访问访问访问的,所以无论是派生类成员还是通过派生类的,所以无论是派生类成员还是通过派生类的,所以无论是派生类成员还是通过派生类的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类的的对象,都无法直接访问基类的的对象,都无法直接访问基类的的对象,都无法直接访问基类的privateprivateprivateprivate成员。成员。成员。成员。4.1继承与派生类继承与派生类基类成员基类成员private成员成员public成员成员protected成员成员内部访问内部访问对象访问对象访问不可访问不可访问不可访问不可访问可访问可访问不可访问不可访问可访问可访问不可访问不可访问classfathclassfathpublic:public:intainta,b b;intgetx()returnX;intgetx()returnX;intgety()returnY;intgety()returnY;protectedprotected:intcintc,d d;private:private:intX,Y;intX,Y;说明:class son:protected fath int W,H;pubulic:void large();等价于等价于classson/classson/public:public:/voidlarge();voidlarge();protectedprotected:intainta,b b;intgetx()returnX;intgetx()returnX;intgety()returnY;intgety()returnY;intcintc,d d;private:private:/intW,H;intW,H;fatherprivate:fatherprivate:intX,Y;intX,Y;son:son1;son1 可以访问large()son1.large 可以访问 除了X、Y以外的任 何成员4.1继承与派生类继承与派生类l l例例例例4.44.4保护继承的访问规则。保护继承的访问规则。保护继承的访问规则。保护继承的访问规则。#include#includeclassclassBaseBase publicpublic:intz;intz;voidsetx(inti)x=i;voidsetx(inti)x=i;intgetx()returnx;intgetx()returnx;privateprivate:intx;intx;protectedprotected:inty;inty;classclassDerivedDerived:protectedprotected BaseBase publicpublic:intp;intp;4.1继承与派生类继承与派生类voidsetall(inta,intb,intc,intd,inte,intf);voidsetall(inta,intb,intc,intd,inte,intf);voidshow();voidshow();privateprivate:intm;intm;protectedprotected:intn;intn;voidDerivedvoidDerived setall(inta,intb,intc,intd,inte,intf)setall(inta,intb,intc,intd,inte,intf)x=a;x=a;/非法非法非法非法,在类在类在类在类DerivedDerived中中中中,x,x为不可直接访问成员为不可直接访问成员为不可直接访问成员为不可直接访问成员,可修改为可修改为可修改为可修改为setx(a);setx(a);y=b;/y=b;/合法合法合法合法,y,y在类在类在类在类derivedderived中为中为中为中为protectedprotected成员成员成员成员z=c;/z=c;/合法合法合法合法,z,z在类在类在类在类derivedderived中为中为中为中为protectedprotected成员成员成员成员m=d;m=d;n=e;n=e;p=f;p=f;4.1继承与派生类继承与派生类voidDerivedvoidDerived show()show()/coutx=xendl;/coutx=xendl;/非法非法非法非法,在类在类在类在类DerivedDerived中中中中,x,x为不可直接访问成员为不可直接访问成员为不可直接访问成员为不可直接访问成员coutx=getx()endl;/coutx=getx()endl;/合法合法合法合法,getx(),getx()在类在类在类在类derivedderived中为中为中为中为protectedprotected成员成员成员成员couty=yendl;couty=yendl;/合法合法合法合法,y,y在类在类在类在类derivedderived中为中为中为中为protectedprotected成员成员成员成员coutz=zendl;coutz=zendl;/合法合法合法合法,z,z在类在类在类在类derivedderived中为中为中为中为protectedprotected成员成员成员成员coutm=mendl;coutn=nendl;coutm=mendl;coutn=nendl;voidmain()voidmain()DerivedDerivedobj;obj.setall(1,2,3,4,5,6);obj.show();obj;obj.setall(1,2,3,4,5,6);obj.show();coutp=obj.pendl;/coutp=obj.pendl;/合法合法合法合法,p,p在类在类在类在类derivedderived中为中为中为中为publicpublic成员成员成员成员 x=1x=1y=2y=2z=3z=3m=4m=4n=5n=5p=6p=6u4.2.1派生类构造函数和析构函数的执行顺序派生类构造函数和析构函数的执行顺序l l当当当当创建创建创建创建派生类派生类派生类派生类对象时对象时对象时对象时,首,首,首,首先先先先执行执行执行执行基类基类基类基类的构造函数的构造函数的构造函数的构造函数,随随随随后后后后再执再执再执再执行行行行派生类派生类派生类派生类的构造函数的构造函数的构造函数的构造函数;l l当当当当撤消撤消撤消撤消派生类派生类派生类派生类对象时对象时对象时对象时,则,则,则,则先先先先执行执行执行执行派生类派生类派生类派生类的析构函数,随的析构函数,随的析构函数,随的析构函数,随后后后后再执行再执行再执行再执行基类基类基类基类的析构函数。的析构函数。的析构函数。的析构函数。例例例例4.54.5基类和派生类的构造函数及析构函数的执行顺序。基类和派生类的构造函数及析构函数的执行顺序。基类和派生类的构造函数及析构函数的执行顺序。基类和派生类的构造函数及析构函数的执行顺序。#include#includeclassclassBaseBase public:public:Base()coutConstructingbaseclassn;Base()coutConstructingbaseclassn;/基类的构造函数基类的构造函数基类的构造函数基类的构造函数4.2派生类的构造函数和析构函数派生类的构造函数和析构函数4.2派生类的构造函数和析构函数派生类的构造函数和析构函数Base()coutDestructingbaseclassn;Base()coutDestructingbaseclassn;/基类的析构函数基类的析构函数基类的析构函数基类的析构函数;classclassDeriveDerive:public:public BaseBase public:public:Derive()coutConstructingderivedclassn;Derive()coutConstructingderivedclassn;/派生类的构造函数派生类的构造函数派生类的构造函数派生类的构造函数Derive()coutDestructingderivedclassn;Derive()coutDestructingderivedclassn;/派生类的析构函数派生类的析构函数派生类的析构函数派生类的析构函数;main()main()Deriveop;Deriveop;return0;return0;构建:构建:先人后己!先人后己!撤销:撤销:先己后人!先己后人!输出输出:ConstructingbaseclassConstructingderivedclassDestructingderivedclassDestructingbaseclassuu4.2.24.2.2派生类构造函数和析构函数的构造规则派生类构造函数和析构函数的构造规则派生类构造函数和析构函数的构造规则派生类构造函数和析构函数的构造规则l下面两种情况下,必须定义派生类的构造函下面两种情况下,必须定义派生类的构造函数:数:派生类本身需要构造函数派生类本身需要构造函数派生类本身需要构造函数派生类本身需要构造函数在定义派生类对象时在定义派生类对象时在定义派生类对象时在定义派生类对象时,其相应其相应其相应其相应基类对象需要调用带有参数基类对象需要调用带有参数基类对象需要调用带有参数基类对象需要调用带有参数的构造函数的构造函数的构造函数的构造函数l派生类构造函数的一般格式为派生类构造函数的一般格式为:派生类名派生类名派生类名派生类名(参数总表参数总表参数总表参数总表):):基类名基类名基类名基类名(参数表参数表参数表参数表)/派生类新增成员的初始化语句派生类新增成员的初始化语句派生类新增成员的初始化语句派生类新增成员的初始化语句 例例例例4.64.6当基类含有带参数的构造函数时当基类含有带参数的构造函数时当基类含有带参数的构造函数时当基类含有带参数的构造函数时,派生类构造函数的构造方法。派生类构造函数的构造方法。派生类构造函数的构造方法