《派生类与继承》PPT课件.ppt
《《派生类与继承》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《派生类与继承》PPT课件.ppt(70页珍藏版)》请在三一办公上搜索。
1、第4章 派生类与继承,4.1 继承与派生类,4.1.1 为什么要使用继承重用:通过继承机制,利用已有的类来定义新类,新的类不仅可以有新的成员,还拥有从已有的类继承来的成员。已有的类称为基类或父类,新的类称为派生类或子类。如果派生类从一个基类派生的,称这种继承为单继承;如果派生类从多个基类派生的,称这种继承为多继承。,4.1 继承与派生类,单继承,4.1 继承与派生类,多继承,4.1 继承与派生类,4.1.2 派生类的声明如果不采用派生类方法class person protected:char name10;int age;char sex;public:void print();,class
2、 employee protected:char name10;int age;char sex;char department20;float salary;public:print();,重复书写!,4.1 继承与派生类,改写/定义一个基类 class person protected:char name10;int age;char sex;public:/;/定义一个派生类 class employee:public person protected:char department20;float salary;public:/;,4.1 继承与派生类,声明一个派生类的一般格式为:cl
3、ass 派生类名:继承方式 基类名 派生类新定义成员;其中,继承方式有3种:public(公有派生)、private(私有派生,缺省情况下也如此)、protected(保护派生)。,由类person继承出类employee可以采用下面的三种格式之一:(1)公有继承 class employee:public person/;(2)私有继承 class employee:private person/;(3)保护继承 class employee:protected person/;,4.1 继承与派生类,派生类的变异功能 从已有类派生出新类时,可以在派生类内完成以下几种功能:(1)可以增加新的
4、数据成员;(2)可以增加新的成员函数;(3)可以重新定义基类中已有的成员函数;(4)可以改变现有成员的属性。,4.1 继承与派生类,4.1.3 基类成员在派生类中的访问属性,4.1 继承与派生类,不可见,可见,可见,4.1.4 派生类对基类成员的访问规则 派生类对基类成员的访问形式主要有以下两种:(1)内部访问:由派生类中新增成员对基类继承来的成员的访问。(2)对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。,4.1 继承与派生类,私有继承的访问规则基类的public成员和protected成员被继承后作为派生类的private成员,派生类的其他成员可以直接访问它们,但是在
5、类外部通过派生类的对象无法访问。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。,4.1 继承与派生类,class fathpublic:int a,b;int getx()return X;int gety()return Y;protected:int c,d;private:int X,Y;,说明:,class son:private fath int W,H;pubulic:void large();,等价于,class son/publ
6、ic:/void large();protected:private:/int W,H;int a,b;int getx()return X;int gety()return Y;int c,d;fatherprivate:int X,Y;,son:son1;son1 可以访问large()son1.large 可以访问 除了X、Y以外的任 何成员,4.1 继承与派生类,例4.1一个私有继承的例子#include iostream.h class x int a;public:x()a=12;int get()return a;void print()cout a endl;class y:x
7、/私有继承 int b;/,4.1 继承与派生类,public:void make()b=get()+10;/调用了基类的成员 void print()x:print();cout b endl;void main()x x1;class y y1;y1.make();y1.get();/错误 x1.get();/对 y1.print();/输出 12 22,4.1 继承与派生类,改变继承访问规则若希望基类中某些公有成员在派生类中也是公有的,使派生类的使用者能访问它,则可在派生类的公有段说明这些成员,说明的格式为:基类名:成员名;,例 class x int a;public:int b;x(
8、)a=12;b=11;int get()return a;void print()cout a endl;class y:x/私有继承/,4.1 继承与派生类,public:void make()b=get()+10;/调用了基类的成员 void print()x:print();cout b endl;x:get;/x类中的get函数 x:b;/x类中的数据成员b;void main()class x x1;class y y1;y1.make();cout y1.get()y1.b endl;/正确 x1.get();/对 y1.print();/输出 12 22,4.1 继承与派生类,通
9、过访问声明调整访问域 访问声明仅仅调整名字的访问,不可为它说明任何类型;若名字为成员函数,在访问声明时,也不准说明任何参数。访问声明只能调整基类的保护段和公有段成员在派生类中的访问域。不允许在派生类中降低或提升基类成员的可访问性。基类的保护段成员只在派生类中的保护段中进行访问声明;基类的公有段成员只能在派生类的公有段中进行声明。,class x int a;protected:int b;public:int c;class y:x pulic:x:b;/error protected:x:c;/error;,4.1 继承与派生类,对重载函数的访问声明将调整基类中具有该名的所有函数的访问域。c
10、lass x public:f();f(int a);f(char*p);.class y:x.pulic:x:f;.;,4.1 继承与派生类,若派生类中具有与基类同名的函数,则基类中的此函数不能在派生类中进行访问声明。class x public:f();f(int a);f(char*p);.class y:x public:void f(int s);x:f;/error;,公有继承的访问规则基类的public成员和protected成员被继承到派生类中仍作为派生类的public成员和protected成员,派生类的其他成员可以直接访问它们。但是,类的外部使用者只能通过派生类的对象访问继
11、承来的public成员。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问它们。,4.1 继承与派生类,class fathpublic:int a,b;int getx()return X;int gety()return Y;protected:int c,d;private:int X,Y;,说明:,class son:public fath int W,H;pubulic:void large();,等价于,son:son1;son1 可以访
12、问a、b、getx()、gety()、large()son1.large 可以访问 除了X、Y以外的任 何成员,4.1 继承与派生类,例4.3 公有继承的访问规则#include iostream.h class base int x1,x2;public:void assign(int p1,int p2)x1=p1;x2=p2;int inc1()x1+;return x1;int inc2()x2+;return x2;void display()cout x1 x2 endl;class derive1:base int x3;public:derive1(int p3)x3=p3;,
13、4.1 继承与派生类,void assign(int p1,int p2)base:assign(p1,p2);int inc1()return base:inc1();int inc2()return base:inc2();int inc3()x3+;return x3;void display()base:display();cout x3 endl;class derive2:public base int x4;public:derive2(int p4)x4=p4;int inc1()int temp=base:inc1();temp=base:inc1();temp=base:i
14、nc1();return base:inc1();/相当于x1=x1+4;,解决私有派生情况的对外可见问题,4.1 继承与派生类,int inc4()x4+;return x4;void display()base:display();cout x4 endl;int main()base p;p.assign(-2,-2);cout base-:n;p.display();/-2-2 derive1 d1(-4);d1.assign(10,10);cout nderive1-:n;d1.display();/x1=10 x2=10 x3=-4 d1.inc1();d1.inc2();d1.i
15、nc3();cout nderive1-2-:n;,4.1 继承与派生类,d1.display();/x1=11 x2=11 x3=-3 derive2 d2(5);d2.assign(-11,-12);/调用基类成员函数 cout nderive2-:n;d2.display();/x1=-11 x2=-12 x4=5 d2.inc1();/对x1 4次加1 x1=-7 d2.inc4();/x4=6 cout nderive2-:n;d2.display();/x1=-7 x2=-12 x4=6 d2.base:inc1();/x1=-6 cout nderive2-:n;d2.displ
16、ay();return 0;,保护继承的访问规则基类的public成员和protected成员被继承到派生类中都作为派生类的protected成员,派生类的其他成员可以直接访问它们,但是类的外部使用者不能通过派生类的对象来访问它们。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类的private成员。,4.1 继承与派生类,class fathpublic:int a,b;int getx()return X;int gety()return Y;protected:int c,d;private:int X,Y;,说明:,c
17、lass son:protected fath int W,H;pubulic:void large();,等价于,class son/public:/void large();protected:int a,b;int getx()return X;int gety()return Y;int c,d;private:/int W,H;fatherprivate:int X,Y;,son:son1;son1 可以访问large()son1.large 可以访问 除了X、Y以外的任 何成员,4.1 继承与派生类,例4.4 保护继承的访问规则。#includeclass Basepublic:i
18、nt z;void setx(int i)x=i;int getx()return x;private:int x;protected:int y;class Derived:protected Basepublic:int p;,4.1 继承与派生类,void setall(int a,int b,int c,int d,int e,int f);void show();private:int m;protected:int n;void Derivedsetall(int a,int b,int c,int d,int e,int f)x=a;/非法,在类Derived中,x为不可直接访问
19、成员,可修改为setx(a);y=b;/合法,y在类derived中为protected成员 z=c;/合法,z在类derived中为protected成员 m=d;n=e;p=f;,4.1 继承与派生类,void Derivedshow()/coutx=xendl;/非法,在类Derived中,x为不可直接访问成员 coutx=getx()endl;/合法,getx()在类derived中为protected成员 couty=yendl;/合法,y在类derived中为protected成员 coutz=zendl;/合法,z在类derived中为protected成员 coutm=mend
20、l;coutn=nendl;void main()Derived obj;obj.setall(1,2,3,4,5,6);obj.show();coutp=obj.pendl;/合法,p在类derived中为public成员x=1y=2z=3m=4n=5p=6,4.2.1 派生类构造函数和析构函数的执行顺序当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数;当撤消派生类对象时,则先执行派生类的析构函数,随后再执行基类的析构函数。例4.5 基类和派生类的构造函数及析构函数的执行顺序。#include class Base public:Base()coutConstructi
21、ng base classn;/基类的构造函数,4.2 派生类的构造函数和析构函数,4.2 派生类的构造函数和析构函数,Base()coutDestructing base classn;/基类的析构函数;class Derive:public Base public:Derive()coutConstructing derived classn;/派生类的构造函数 Derive()coutDestructing derived classn;/派生类的析构函数;main()Derive op;return 0;,构建:先人后己!,撤销:先己后人!,输出:Constructing base c
22、lassConstructing derived classDestructing derived classDestructing base class,4.2.2 派生类构造函数和析构函数的构造规则下面两种情况下,必须定义派生类的构造函数:派生类本身需要构造函数在定义派生类对象时,其相应基类对象需要调用带有参数的构造函数派生类构造函数的一般格式为:派生类名(参数总表):基类名(参数表)/派生类新增成员的初始化语句例4.6 当基类含有带参数的构造函数时,派生类构造函数的构造方法。,4.2 派生类的构造函数和析构函数,#include class Base public:Base(int n)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 派生类与继承 派生 继承 PPT 课件
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5635410.html