第8章_继承与派生.ppt
*在C++中可重用性是通过继承(inheritance)这一机制来实现的。继承是C++的一个重要组成部分。一个类中包含了若干数据成员和成员函数。在不同的类中,数据成员和成员函数是不相同的。但有时两个类的内容基本相同或有一部分相同。以马为例来说明继承的概念马是公马与母马的父类,公马与母马是马的子类,又是白公马与黑母马等的父类这种继承关系所形成的层次是一个树形结构在类族中,直接参与派生出某类的基类称为直接基类,基类的基类甚至更高层的基类称为间接基类。*派生方式[public/private/protected]中关键字public(公有继承)、private(私有继承[‘praivit])、protected(保护继承,[pr?’tekt])表示3种不同的继承方式,使用时只能选择一个。*先显示前一幻灯片的例子,然后说明基类与派生类之间的继承关系派生类中的成员包括从基类继承过来的成员和自己增加的成员两大部分。在基类中包括数据成员和成员函数(或称数据与方法)两部分,派生类分为两大部分:一部分是从基类继承来的成员,另一部分是在声明派生类时增加的部分。每一部分均分别包括数据成员和成员函数。*根据访问权限,继承分为公有继承、私有继承、保护继承,派生类对基类成员的访问就由以下访问规则确定:访问规则:1.基类的public和protected成员的访问属性在派生类中保持不变,在派生类中基类的private成员不可访问2.派生类中的成员函数可以直接访问基类的public和protected成员,但不能访问基类的private成员3.通过派生类的对象只能访问基类的public成员*从本例可以看出,派生类的成员函数fn能访问public和protected声明的基类成员,但在main中,对象只可访问public声明的基类成员本片总结:本例说明了派生类及外部对象对基类数据成员的访问规则*访问规则:1.基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可访问2.派生类中的成员函数可以直接访问基类的public和protected成员,但不能访问基类的private成员3.通过派生类的对象不能访问基类的任何成员*本例对例10.2采用私有继承从本例可以看出,在类外部通过派生类的对象根本无法访问基类的任何成员,基类原有的外部接口被派生类封闭和隐藏起来*访问规则:1.基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可访问2.派生类中的成员函数可以直接访问基类的public和protected成员,但不能访问基类的private成员3.通过派生类的对象不能访问基类的任何成员从继承的访问规则来看,无论是私有派生还是公有派生,派生类都无权访问它的基类的私有成员保护类成员可以被派生类的成员函数访问,但是对于外界是隐藏的,外部函数不能访问它为了便于派生类访问,可以将基类中需要提供给派生类访问的成员定义为保护成员*例10.4对应p279的例10.5在本例中,child类派生于demo类,由于demo类的数据成员j为保护成员,所以child类可以像访问自己的数据成员一样访问该成员child([t?aild])类成员函数sub将其基类数据成员j的值减(i-2)*主要讨论派生类构造函数与析构函数的执行顺序.继承是使派生类的对象不仅拥有派生类中定义的数据成员和成员函数,而且拥有基类中的数据成员和成员函数但基类中的两个特殊成员函数——构造函数与析构函数不能被继承派生类的构造函数要初始化派生类中的数据成员,也要初始化基类对象*、*例10.6对应p282的例10.7定义派生类构造函数时,传递一个参数给基类构造函数**例10.7对应p285的例10.8//aa为基类对象,作为派生类的对象成员//定义派生类的构造函数时,把参数传递给基类和对象成员构造函数总结:派生类构造函数和析构函数的执行顺序与定义方法*Assistant(助教前面讨论的是单继承,即一个类是从一个基类派生而来的。实际上,常常有这样的情况:一个派生类有两个或多个基类,派生类从两个或多个基类中继承所需的属性。C++为了适应这种情况,允许一个派生类同时继承多个基类。这种行为称为多重继承图说明:例如,一所大学有教员和学生,若从研究生中聘请助教,则助教属于教员与学生两个范畴**举例说明多继承:基类Teacher的数据成员为name(