预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共77页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第五章:继承性和多态性第1部分继承与派生1.继承的概念和派生类的定义 继承和派生的基本概念: 继承性是面向对象程序设计的重要特性之一,C++程序的可重用性是通过继承机制来实现的。 继承在概念上将具有从属关系的类连接起来,便于描述现实实体的层次关系。 在C++中,所谓“继承”就是在一个已存在的类的基础上建立一个新的类。 派生类继承了基类(父类)的所有数据成员和成员函数,并可以对成员作必要的增加或调整。 基类和派生类是相对而言的,形成类的继承层次结构: ①父类可以派生出多个子类。 ②子类又可以作为父类,再派生出新的派生类。 ③所有的子孙后代都继承了祖辈的基本特征,同时又有区别和发展。 单继承:一个派生类只继承一个基类,这种继承关系所形成的层次是一个树形结构。CObject多继承:一个派生类继承两个或多个基类。 派生类的定义方法: 前例中,已声明过一个基类Student,在此基础上通过单继承建立一个派生类Student1。单继承派生类的声明格式: class<派生类名>:<继承方式><基类名> { <派生类新增加的数据成员> <派生类新增加的成员函数> }; 多继承派生类的定义格式为: class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,… { <派生类新增加的数据成员> <派生类新增加的成员函数> }; 继承方式包括:public(公用的),private(私有的)和protected(受保护的),缺省为私有的。 派生类的构成: 派生类成员有两部分:一是从基类继承过来的成员,体现共性;二是自己增加的成员,体现个性。 构造一个派生类包括以下3部分工作: ①不可选择地从父类接收全部成员(构造和析构函数除外)。 缺陷:数据冗余、空间浪费和效率降低。这在目前C++中无法解决。 解决:在设计基类时要充分考虑到派生类的需要。(事实上有些类是专门作为基类而设计的) ②调整从基类接收的成员: 方法一:改变基类成员在派生类中的访问属性——通过指定继承方式来实现。 方法二:在派生类声明同名成员——覆盖基类成员。!!注意,对于成员函数,不仅要同名还要参数个数和类型都相同。(请问,这是为什么?) ③在声明派生类时增加成员: 体现派生类对基类功能的扩展,同时定义自己的构造和析构函数,这需要精心设计。程序5-1:CPoint类及其派生类CRect派生类成员的访问属性: 派生类具有两部分成员,且不是简单直接继承,因而其访问属性势必复杂。2、派生类的继承方式: 公有继承(public):保持C++封装特性,保护私有成员,依然是不变的原则。 ﹡可以知道:一个成员在不同派生层次中的访问属性可能是不同的,它与继承方式有关。classStudent1:privateStudent {private: intage; stringaddr; public: voiddiaplay_1(); } voidStudent1::display_1(); {cout<<“age:”<<age<<endl; cout<<“address:”<<addr<<endl; }保护继承(protected): 由protected声明的成员称为“受保护的成员”,或简称“保护成员”。 保护成员不能被类外访问(等价于私有成员),但可以被派生类的成员函数引用(相当于公有成员)。 保护继承中,基类的public和protected成员都以protected身份出现在派生类中,基类的private成员不可访问。classA { protected: intx; } intmain() { Aa; a.X=5;//错误 }classStudent1:protectedStudent {private: intage; stringaddr; public: voiddiaplay_1(); } voidStudent1::diaplay_1(); {cout<<“num:”<<num<<endl; cout<<“name:”<<name<<endl; cout<<“sex:”<<sex<<endl; cout<<“age:”<<age<<endl; cout<<“address:”<<addr<<endl; } 分析上表: ①基类中的私有成员在派生类中均为不可访问。 ②其他成员总是在自身访问属性和继承方式中选择较严格者作为派生类中成员的访问属性。 比较私有继承和保护继承: ①在直接派生类中的实际作用是相同的,即在类外都不能访问,类中的成员函数可以访问。 ②在新的派生类中的作用不同,即原来私有基类中的成员在新类中都不能访问,原来保护基类中的成员可以在新类中被访问。 由此看出