您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > C++语言程序设计教程(第二版)清华出版 杨进才第8章 继承与派生
第8章继承与派生制作人:沈显君杨进才C++语言程序设计教程第8章继承与派生C++语言程序设计教程第8章继承与派生第8章继承与派生学习目标1.掌握派生与继承的概念与使用方法;2.能够运用继承机制对现有的类进行重用;3.掌握继承中的构造函数与析构函数的调用顺序;4.为派生类设计合适的构造函数初始化派生类;5.掌握处理多继承时的二义性问题;6.掌握虚基类的概念与使用方法。8.1继承与派生在C++中,可以利用已有的类来定义新的类,新类将拥有原有类的全部特性,原有类被称为基类(Baseclass)或父类(Superclass),新产生的类被称为派生类(Derivedclass)或子类(Subclass)。派生类拥有基类的特性称作继承,由基类产生派生类的过程称为派生。8.1.1继承的概念每一个派生类都有且仅有一个基类,派生类可以看作是基类的特例,它增加了某些基类所没有的性质。这种继承方式,称为单继承或单向继承。现实生活中,子女的外貌、血型往往不是仅仅继承自父亲或母亲,而是将父母亲的特点都继承下来。与之相类似,如果一个派生类有两个或两个以上的基类,则称为多继承或多重继承。派生类又作为基类,继续派生新的类,这样的派生方式称为多层派生,从继承的角度看称为多层继承。C++语言程序设计教程第8章继承与派生C++语言程序设计教程第8章继承与派生8.1.1继承的概念单继承多继承人教师学生研究生本科生专科生教授讲师助教研究生助教派生类定义的语法为:class派生类名:继承方式1基类名1,继承方式2基类名2,…{private:派生类的私有数据和函数public:派生类的公有数据和函数protected:派生类的保护数据和函数};8.1.2派生类实现1.派生类的定义C++语言程序设计教程第8章继承与派生“继承方式1基类名1,继承方式2基类名2,…”为基类名表,表示当前定义的派生类的各个基类。如果基类名表中只有一个基类,表示定义的是单继承;如果基类名表中有多个基类,表示定义的是多继承。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。继承方式有三种:public:公有继承;private:私有继承;protected:保护继承。8.1.2派生类实现classClock{private:intH,M,S;public:voidSetTime(intH=0,intM=0,intS=0);voidShowTime();Clock(intH=0,intM=0,intS=0);~Clock();};classAlarmClock:publicClock{private:intAH,AM;//响铃的时间boolOpenAlarm;//是否关闭闹钟public:voidSetAlarm(intAH,intAM);//设置响铃时间voidSwitchAlarm(boolOpen=true);//打开/关闭闹铃voidShowTime();//显示当前时间与闹铃时间}C++语言程序设计教程第8章继承与派生在派生类的定义中,每一种继承方式只限定紧跟其后的那个基类。如果不显式给出继承方式,系统默认为私有继承。【例如】在普通的时钟类Clock基础上派生出闹钟类AlarmClock:类名成员名AlarmClock::Clock::H,M,SSetTime()ShowTime()AH,AM,OpenAlarmSetAlarm()SwitchAlarm()ShowTime()AlarmClock()派生类AlarmClock的成员构成图(表)8.1.2派生类实现C++语言程序设计教程第8章继承与派生2.派生类的实现方式(1)吸收基类成员基类的全部成员被派生类继承,作为派生类成员的一部分。如:Clock类中的数据成员H、M、S,成员函数SetTime()、ShowTime()经过派生,成为派生类AlarmClock的成员。(2)改造基类成员派生类根据实际情况对继承自基类的某些成员进行限制和改造。对基类成员的访问限制主要通过继承方式来实现;对基类成员的改造主要通过同名覆盖来实现,即在派生类中定义一个与基类成员同名的新成员(如果是成员函数,则函数参数表也必须相同,否则,C++会认为是函数重载)。当通过派生类对象调用该成员时,C++将自动调用派生类中重新定义的同名成员,而不会调用从基类中继承来的同名成员,这样派生类中的新成员就“覆盖”了基类的同名成员。由此可见,派生类中的成员函数具有比基类中同名成员函数更小的作用域。如:AlarmClock类中的成员函数ShowTime()覆盖了基类Clock中的同名成员函数ShowTime()。(3)添加新成员派生类在继承基类成员的基础之上,根据派生类的实际需要,增加一些新的数据成员和函数成员,以描述某些新的属性和行为。如:AlarmClock添加了数据成员AH、AM、OpenAlarm,成员函数SetAlarm()、SwitchAlarm()。8.1.2派生类实现C++语言程序设计教程第8章继承与派生3.继承的性质(1)继承关系是可以传递的在派生过程中,一个基类可以同时派生出多个派生类,派生出来的新类也同样可以作为基类再继续派生新的派生类。这样,就形成了一个相互关联的类的家族,有时也称作类族。在类族中,直接派生出某类的基类称为直接基类,基类的基类甚至更高层的基类称为间接基类,比如类A派生出类B,类B又派生出类C,则类B是类C的直接基类,类A是类B的直接基类,而类A称为类C的间接基类。(2)继承关系不允许循环在派生过程中,不允许类A派生出类B,类B又派生出类C,而类C又派生出类A。8.1.3继承与组合C++语言程序设计教程第8章继承与派生继承描述的是一般类与特殊类的关系,类与类之间体现的是“isakindof”,即如果在逻辑上A是B的一种(isakindof),则允许A继承B的功能和属性。例如汽车(automobile)是交通工具(vehicle)的一种,小汽车(car)是汽车的一种。那么类automobile可以从类vehicle派生,类car可以从类automobile派生。组合描述的是整体与部分的关系,类与类之间体现的是“isapartof”,即如果在逻辑上A是B的一部分(isapartof),则允许A和其他数据成员组合为B。例如:发动机、车轮、电池、车门、方向盘、底盘都是小汽车的一部分,它们组合成汽车。而不能说发动机是汽车的一种。继承和组合既有区别,也有联系,某些比较复杂的类,既需要使用继承,也需要使用组合,二者一起使用。在某些情况下,继承与组合的实现还可以互换。在多继承时,一个派生类有多个直接基类,派生类实际上是所有基类属性和行为的组合。派生类是对基类的扩充,派生类成员一部分是从基类中来,因此派生类组合了基类。既然这样,派生类也可以通过组合类实现。例如:AlarmClock类可以通过组合Clock类实现,从功能上讲,基本的时钟功能是闹钟功能的一部分。什么时候使用继承,什么时候使用组合,要根据问题类与类之间的具体关系,顺其自然,权衡考虑。8.2继承的方式C++语言程序设计教程第8章继承与派生①基类的公有成员在派生类中仍然为公有成员,可以由派生类对象和派生类成员函数直接访问。②基类的私有成员在派生类中,无论是派生类的成员还是派生类的对象都无法直接访问。③保护成员在派生类中仍是保护成员,可以通过派生类的成员函数访问,但不能由派生类的对象直接访问。8.2.1公有继承公有方式继承的特点:注意:对基类成员的访问,一定要分清是通过派生类对象访问还是通过派生类成员函数访问。C++语言程序设计教程第8章继承与派生【例8-1】公有继承及其访问将点理解为半径长度为0的圆,Point(点)类公有派生出新的Circle(圆)类。圆类具备Point类的全部特征,同时自身也有自己的特点:圆有半径。8.2.1公有继承123456789101112131415161718192021//Point.h#includeiostreamusingnamespacestd;classPoint{private:intX,Y;public:Point(intX=0,intY=0){this-X=X,this-Y=Y;}voidmove(intOffX,intOffY){X+=OffX,Y+=OffY;}voidShowXY(){cout(X,Y)endl;}};C++语言程序设计教程第8章继承与派生8.2.1公有继承1234567891011121314151617181920212223242526/*******************************Circle.h**从Point类派生出圆类(Circle)********************************/#includepoint.hconstdoublePI=3.14159;classCircle:publicPoint{private:doubleradius;//半径public:Circle(doubleR,intX,intY):Point(X,Y){radius=R;}doublearea()//求面积{returnPI*radius*radius;}voidShowCircle(){coutCentreofcircle:;ShowXY();coutradius:radiusendl;}};类名成员名访问权限CirclePoint::X,Yprivate不可访问move()publicpublicShowXY()publicpublicradiusprivatearea()publicShowCircle()publicCircle()publicC++语言程序设计教程第8章继承与派生8.2.1公有继承313233343536373839404142434445/***********************p8_1.cpp**Circle类的使用************************/#includeCircle.husingnamespacestd;intmain(){CircleCir1(10,100,200);Cir1.ShowCircle();coutareais:Cir1.area()endl;Cir1.move(10,20);Cir1.ShowXY();return0;}运行结果Centreofcircle:(100,200)radius:10areais:31415.9(110,220)C++语言程序设计教程第8章继承与派生8.2.1公有继承1234567891011121314151617181920212223242526/*******************************Circle.h**从Point类派生出圆类(Circle)********************************/#includepoint.hconstdoublePI=3.14159;classCircle:publicPoint{private:doubleradius;//半径public:Circle(intX,intY,doubleR):Point(X,Y){radius=R;}doublearea()//求面积{returnPI*radius*radius;}voidShowCircle(){coutCentreofcircle:;ShowXY();coutradius:radiusendl;}};程序解释派生类Circle继承了Point类的除构造函数外的全部成员,拥有从基类继承过来的成员与派生类新添加的成员的总和。继承方式为公有继承,这时,基类中的公有成员在派生类中访问属性保持原样,派生类的成员函数及对象可以访问基类派生的的公有成员。基类原有的外部接口(公有成员函数),如ShowXY()和move()变成了派生类外部接口的一部分。在C
本文标题:C++语言程序设计教程(第二版)清华出版 杨进才第8章 继承与派生
链接地址:https://www.777doc.com/doc-3262995 .html