《C++程序设计教程与实验指导》课件第5章继承与派生.ppt

上传人(卖家):momomo 文档编号:7375425 上传时间:2023-12-12 格式:PPT 页数:60 大小:983.50KB
下载 相关 举报
《C++程序设计教程与实验指导》课件第5章继承与派生.ppt_第1页
第1页 / 共60页
《C++程序设计教程与实验指导》课件第5章继承与派生.ppt_第2页
第2页 / 共60页
《C++程序设计教程与实验指导》课件第5章继承与派生.ppt_第3页
第3页 / 共60页
《C++程序设计教程与实验指导》课件第5章继承与派生.ppt_第4页
第4页 / 共60页
《C++程序设计教程与实验指导》课件第5章继承与派生.ppt_第5页
第5页 / 共60页
点击查看更多>>
资源描述

1、第5章 继承与派生人类教师类学生类管理人员类教师管理人员类多继承:派生类多继承:派生类有多个基类有多个基类单继承:派生类单继承:派生类只有一个基类只有一个基类直接基类直接基类间接基类间接基类第7章 继承与派生#include#include using namespace std;class CLocation /位置坐标类private:int x;int y;public:CLocation(int x=0,int y=0);void MoveTo(int x,int y);int Getx();int Gety();第5章 继承与派生CLocation:CLocation(int x,i

2、nt y)CLocation:x=x;/可以写成 this-x=x;CLocation:y=y;/可以写成 this-y=y;void CLocation:MoveTo(int x,int y)CLocation:x=x;/可以写成 this-x=x;CLocation:y=y;/可以写成 this-y=y;int CLocation:Getx()return x;int CLocation:Gety()return y;可通过域运算符(可通过域运算符(:)访问类中的)访问类中的成员成员x和和y,与使用,与使用this指针有同样指针有同样作用作用第5章 继承与派生class CPoint:pu

3、blic CLocation /从CLocation中公有继承private:char Color10;public:CPoint(char*c);void SetColor(char*c);void Show();CPoint:CPoint(char*c)strcpy(Color,c);void CPoint:SetColor(char*c)strcpy(Color,c);void CPoint:Show()cout Getx(),Gety()Color endl;第5章 继承与派生调用从调用从CLocation类中继承来的成类中继承来的成员函数员函数GetX()和和GetY()。位置坐标通

4、过位置坐标通过CLocation类构造函类构造函数的默认参数值设置为(数的默认参数值设置为(0,0)第5章 继承与派生 返 回第5章 继承与派生第5章 继承与派生错误信息:错误信息:“不能访问不能访问CLocation类中类中的私有成员的私有成员x,y”第5章 继承与派生将将x,y改为保护成员后,上面的改为保护成员后,上面的show()就可以直接访问成员就可以直接访问成员x和和y了了第5章 继承与派生第5章 继承与派生第5章 继承与派生错误:不能在主函数中访问错误:不能在主函数中访问CLocation类的类的函数函数MoveTo(),只能在派生类的,只能在派生类的成员函数中访问成员函数中访问第

5、5章 继承与派生用基类名和域运算符(用基类名和域运算符(:)可以)可以访问基类的成员函数访问基类的成员函数MoveTo(),若不加限定,由于基类和派生类若不加限定,由于基类和派生类都有成员函数都有成员函数MoveTo(),将优先,将优先调用派生类本身的同名成员函数调用派生类本身的同名成员函数MoveTo()。第5章 继承与派生第5章 继承与派生第5章 继承与派生第5章 继承与派生第5章 继承与派生 派生控制派生控制基类成员基类成员#include using namespace std;class Clock public:Clock(int h=0,int m=0,int s=0);Cloc

6、k(Clock&c);void SetTime(int h,int m,int s);void ShowTime();private:int Hour;int Minute;int Second;第5章 继承与派生Clock:Clock(int h,int m,int s)/构造函数的参数用于初始化时、分、秒构造函数的参数用于初始化时、分、秒 Hour=h;Minute=m;Second=s;Clock:Clock(Clock&c)/拷贝构造函数将引用作为参数初始化新建对象拷贝构造函数将引用作为参数初始化新建对象 Hour=c.Hour;Minute=c.Minute;Second=c.Sec

7、ond;第5章 继承与派生class AlermClock:public Clockprivate:int AlermHour;int AlermMinute;int AlermSecond;public:AlermClock(int h=12,int m=0,int s=0);void Alerm();void SetAlermTime(int h,int m,int s);void ShowAlermTime();AlermClock:AlermClock(int h,int m,int s)AlermHour=h;AlermMinute=m;AlermSecond=s;第5章 继承与派生

8、void AlermClock:Alerm()/转义字符a完成响铃cout aaaaaaa;void AlermClock:SetAlermTime(int h,int m,int s)AlermHour=h;AlermMinute=m;AlermSecond=s;void AlermClock:ShowAlermTime()cout AlermHour :AlermMinute :AlermSecond endl;第5章 继承与派生void main()AlermClock c;c.ShowTime();c.ShowAlermTime();c.SetTime(10,30,40);c.SetA

9、lermTime(6,30,0);c.ShowTime();c.ShowAlermTime();c.Alerm();第5章 继承与派生构造函数采用缺省参数值,基类继承的构造函数采用缺省参数值,基类继承的数据成员初始化为(数据成员初始化为(0,0,0),将),将AlermClock类自己定义的数据成员响类自己定义的数据成员响铃时间置为(铃时间置为(12,0,0)返 回第5章 继承与派生第5章 继承与派生#include using namespace std;class A int a;public:A(int x):a(x)cout construct A a endl;第5章 继承与派生用初

10、始化表的方式为用初始化表的方式为a赋值,与函赋值,与函数体中使用数体中使用 a=x 语句作用一样语句作用一样用初始化表的方式为用初始化表的方式为b、d赋值,赋值,为为x和和y初始化,调用基类初始化,调用基类A的构的构造函数为基类成员初始化造函数为基类成员初始化void main(void)B b1(10);第5章 继承与派生执行顺序:执行顺序:先调用基类的构造函数,即执行初始化表中的先调用基类的构造函数,即执行初始化表中的A(v);然后按着成员声明的先后先后顺序,应首先初始化然后按着成员声明的先后先后顺序,应首先初始化b,即执行初始化表中的即执行初始化表中的b(v),接下来是成员,接下来是成员

11、d,即执行,即执行初始化表中的初始化表中的d(b);接下来构造内嵌对象接下来构造内嵌对象x,即执行初始化表中的,即执行初始化表中的x(b+1)。再构造内嵌对象再构造内嵌对象y,即执行初始化表中的,即执行初始化表中的y(b+2);最后执行类最后执行类B自己的构造函数体。自己的构造函数体。第5章 继承与派生#include using namespace std;class Aint a;public:A(int x):a(x)cout construct A a endl;A()cout destruct A a endl;第5章 继承与派生class B:public Aprivate:int

12、 b,c;const int d;A x,y;public:B(int v):b(v),y(b+2),x(b+1),d(b),A(v)c=v;cout construct B b c d endl;B()cout desstruct B b c d endl;void main(void)B b1(10);第5章 继承与派生#include#include using namespace std;class CPointprivate:int X;int Y;public:CPoint(int x=0,int y=0)X=x;Y=y;第5章 继承与派生CPoint(Point&p)X=p.X;

13、Y=p.Y;int GetX()return X;int GetY()return Y;class CShapeprivate:char Color10;public:CShape(char*c)strcpy(Color,c);void Draw()cout Draw a shape.The color is Color endl;void PrintColor()cout Color endl;第5章 继承与派生class CLine:public CShapeprivate:CPoint Start;/线段的起点线段的起点CPoint End;/线段的终点线段的终点public:CLine

14、(CPoint s,CPoint e,char*c):CShape(c),Start(s),End(e)void Draw()cout Draw a Line from(Start.GetX(),Start.GetY();cout )to(End.GetX(),End.GetY(),with color;PrintColor();第5章 继承与派生输出颜色输出颜色Color。因为基类的颜色。因为基类的颜色Color是是私有成员,在这里不能直接访问,只能通私有成员,在这里不能直接访问,只能通过它的公有函数过它的公有函数PrintColor()访问()访问 class CCircle:public

15、 CShapeprivate:CPoint Center;int Radius;public:CCircle(CPoint ctr,int r,char*c):CShape(c),Center(ctr)Radius=r;void Draw()cout Draw a circle at center(Center.GetX(),;cout Center.GetY()with radius Radius and color;PrintColor();第5章 继承与派生void main()CShape s(Red);CPoint p1(10,10),p2(100,100),p3(50,50);CL

16、ine l(p1,p2,Green);CCircle c(p3,20,Black);s.Draw();l.Draw();c.Draw();第5章 继承与派生 父类与子类:如果派生类的派生控制为public,则这样的派生类称为基类的子类,而相应的基类则称为派生类的父类。C+允许父类指针直接指向子类对象,也允许父类引用直接引用子类对象。void main()CShape*ps3;CShape s(Red);CPoint p1(10,10),p2(100,100),p3(50,50);CLine l(p1,p2,Green);CCircle c(p3,20,Black);ps0=&s;ps1=&l;

17、ps2=&c;for(int i=0;iDraw();第5章 继承与派生 虽然父类的指针可以指向子类的对象,但调用虽然父类的指针可以指向子类的对象,但调用的函数的函数Draw()都是父类()都是父类CShape的成员函数的成员函数 返 回第5章 继承与派生#include using namespace std;class CBase1 protected:int b;public:CBase1(int x=0)b=x;cout Construct CBase1!b endl;CBase1()cout Destruct CBase1!b endl;第5章 继承与派生class CBase2 p

18、rotected:int b;public:CBase2(int x=0)b=x;cout Construct CBase2!b endl;CBase2()cout Destruct CBase2!b endl;第5章 继承与派生class CDerived:public CBase1,private CBase2 protected:CBase1 b1;CBase2 b2;int d;public:CDerived(int x,int y,int z):b1(y),CBase2(y),b2(z),CBase1(x)d=z;cout Construct CDerived!d endl;CDer

19、ived()cout Destruct CDerived!d endl;第5章 继承与派生void main()CDerived d1(1,2,3);第5章 继承与派生 构造函数执行顺序:构造函数执行顺序:先调用基类先调用基类CBase1构造函数,再调用基构造函数,再调用基类类CBase2构造函数,然后调用内嵌对象构造函数,然后调用内嵌对象b1构造函数,再调用内嵌对象构造函数,再调用内嵌对象b2的构造的构造函数,最后执行函数,最后执行CDerived类本身的构造类本身的构造函数体。函数体。析构过程与构造过程恰好相反。析构过程与构造过程恰好相反。第5章 继承与派生CBase0CBase1CBas

20、e2CDerived类中继承了两次类中继承了两次CBase0的成员的成员#include using namespace std;class CBase1 protected:int b;public:CBase1(int x=0)b=x;int GetB()return b;第5章 继承与派生class CBase2 protected:int b;public:CBase2(int x=0)b=x;int GetB()return b;class CDerived:public CBase1,private CBase2 protected:int d;public:CDerived(in

21、t x,int y,int z):CBase1(x),CBase2(y)d=z;void Output()cout d b endl;/Error:CDerived:b is ambiguous;void main()CDerived d1(1,2,3);int x=d1.GetB();/Error:CDerived:GetB is ambiguousd1.Output();第5章 继承与派生12 3CBase1:bCBase2:bd对象对象d1的数据成员的数据成员产生二意性,因为不知道访问哪一个基类继承来产生二意性,因为不知道访问哪一个基类继承来的的b,可使用域运算符和基类名来限定,改为:,

22、可使用域运算符和基类名来限定,改为:CBase1:b或或CBase2:b产生二意性,改为:产生二意性,改为:d1.CBase1:GetB()#include using namespace std;class CBase0 protected:int b0;public:CBase0(int x=0)b0=x;int GetB0()return b0;第5章 继承与派生class CBase1:public CBase0 public:CBase1(int x=0):CBase0(x);class CBase2:public CBase0 public:CBase2(int x=0):CBas

23、e0(x);class CDerived:public CBase1,public CBase2 public:CDerived(int x,int y):CBase1(x),CBase2(y);void main()CDerived d1(1,2);cout d1.GetB0()endl;第5章 继承与派生产生二意性,可使用域运算符和基类名来限定,产生二意性,可使用域运算符和基类名来限定,改为:改为:d1.CBase1:GetB0()或或d1.CBase2:GetB0()b0GetB0()CBase0CBase1b0GetB0()CBase2b0GetB0()CDerivedCBase1:b

24、0CBase2:b0CBase1:GetB0()CBase2:GetB0()虽然可以通过域运算符与基类名解决虽然可以通过域运算符与基类名解决二意性问题,但一般情况下并不希望二意性问题,但一般情况下并不希望派生类中有两份基类成员。派生类中有两份基类成员。第5章 继承与派生#include using namespace std;class CBase0 protected:int b0;public:CBase0(int x=0)b0=x;int GetB0()return b0;第5章 继承与派生class CBase1:virtual public CBase0 public:CBase1(

25、int x=0):CBase0(x);class CBase2:virtual public CBase0 public:CBase2(int x=0):CBase0(x);class CDerived:public CBase1,public CBase2 public:CDerived(int x,int y,int z):CBase0(x),CBase1(y),CBase2(z);void main()CDerived d1(10,15,20);cout d1.GetB0()endl;cout d1.CBase1:GetB0()endl;cout d1.CBase2:GetB0()end

26、l;第5章 继承与派生只从基类只从基类CBase0中继承了一次中继承了一次GetB0(),因,因此直接调用不会产生二意性,也可以使用此直接调用不会产生二意性,也可以使用d1.CBase1:GetB0()或或d1.CBase2:GetB0()调用同一个调用同一个GetB0()函数函数如果虚基类没有不带参数的构造函数,且有参数的如果虚基类没有不带参数的构造函数,且有参数的构造函数又没有默认参数值,则其所有的派生类(包构造函数又没有默认参数值,则其所有的派生类(包括间接派生类)的构造函数都必须为它的构造函数括间接派生类)的构造函数都必须为它的构造函数提供参数。基类的数据成员提供参数。基类的数据成员b

27、0得到的值是由最底层的得到的值是由最底层的派生类派生类CDerived的构造函数提供的的构造函数提供的。第5章 继承与派生#include using namespace std;class CBase0 protected:int b0;public:CBase0(int x)b0=x;cout construct CBase0 b0 endl;第5章 继承与派生class CBase2:virtual public CBase0 public:CBase2(int x=0):CBase0(x)cout construct CBase2 x endl;第5章 继承与派生void main()

28、CDerived d1(10,15,20,25,30,35);第5章 继承与派生在构造派生类的对象时,虚基类的成员只被在构造派生类的对象时,虚基类的成员只被初始化一次,且是由最底层派生类的构造函初始化一次,且是由最底层派生类的构造函数通过调用虚基类的构造函数进行的,其他数通过调用虚基类的构造函数进行的,其他基类对虚基类构造函数的调用都被忽略。基类对虚基类构造函数的调用都被忽略。#include#include using namespace std;class CStaff protected:int number;char name10;int age;public:CStaff(int n

29、um,char*na,int a)number=num;age=a;strcpy(name,na);void Display()cout name is a Staff age yeas old,endl;第5章 继承与派生class CTeacher:virtual public CStaff protected:char zch10;public:CTeacher(int num,char*na,int a,char*zc):CStaff(num,na,a)strcpy(zch,zc);void Display()cout name is a Teacher age yeas old,zc

30、h endl;第5章 继承与派生class CManagement:virtual public CStaff protected:char zw10;public:CManagement(int num,char*na,int a,char*z):CStaff(num,na,a)strcpy(zw,z);void Display()cout name is a management age yeas old,zw endl;第5章 继承与派生class CTeacherManagement:public CTeacher,public CManagement public:CTeacherM

31、anagement(int num,char*na,int a,char*zc,char*z):CStaff(num,na,a),CTeacher(num,na,a,zc),CManagement(num,na,a,z)void Display()cout name is a Teacher management age yeas old,zch ,zw endl;第5章 继承与派生不会产生二意性,因为只从虚基类不会产生二意性,因为只从虚基类CStuff中中继承了一次成员继承了一次成员name和和agevoid main()CStaff s1(101,Zhao,20);CTeacher t1(102,Zhang,30,Lecture);CManagement m1(103,Wang,35,dean);CTeacherManagement tm1(104,Li,40,Peofessor,department head);s1.Display();t1.Display();m1.Display();tm1.Display();第5章 继承与派生 不会产生二意性,将优先调用自己类定义的不会产生二意性,将优先调用自己类定义的 Display()函数函数 返 回

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《C++程序设计教程与实验指导》课件第5章继承与派生.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|