版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、5.3调整基类成员在派生类中的访问属性的其他方法,问题提出:当需要让基类的某些成员受保护,而一些成员需要被访问时,可以有两种方法来调整。,531同名成员 当派生类的成员名字和基类的成员名字相同时,称为覆盖继承。 此时如果想访问基类的成员,格式为: 基类名:成员名,#include class Base public: Base(int n) i=n; void print() coutiendl; private: int i; ; class Derive :private Base public: Derive(int n,int m):Base(m) j=n; void print()
2、Base:print(); /coutjendl; private: int j; main() Derive obj(50,60); obj.print(); return 0; ,作用: 1在私有继承方式下,想在类外访问基类的公有成员。 2在公有继承方式下,想对基类的成员函数内容扩充。 3在公有继承方式下,想保留基类的名字但功能上要求不同。,532访问声明:,问题提出: 对私有继承而言,基类的公有函数变成了私有,外界无权访问,只能通过派生类函数调用。但可能带来不便。 有时程序员可能希望基类的个别成员还能给派生类的对象直接访问,而不是通过派生类的公有成员函数间接访问。 方法: 把基类的保护成
3、员或公有成员直接写在私有派生类定义式中同访问属性的段中,加上“基类名:成员名”,称为访问声明。,#include class Base public: Base(int n) i=n; void print() coutiendl; private: int i; ; class Derive :private Base public: Derive(int n,int m):Base(m) j=n; Base:print; private: int j; main() Derive obj(50,60); obj.print(); return 0; ,作用:访问声明机制可以个别调整私有继承
4、方式派生类从基类继承下来的成员性质,从而使外界可以通过派生类的界面直接访问基类的某些成员,同时也不影响其他基类成员的封闭性。 说明: 1数据成员也可以使用访问声明。 2成员函数只含不带类型和参数的函数名。 3访问声明不改变成员原来在基类中的性质,公有只能调整为公有, 保护只能调整为保护,对基类中私有成员不能使用访问声明。 4访问声明将对基类中所有同名函数起作用。,5.4 多继承,派生类只有一个基类,这种派生方法称为单基派生或单继承。 当一个派生类具有多个基类时,这种派生方法称为多基派生或多继承。 多继承也是现实世界中事物之间联系的一种模拟。 比如:软件系统的WINDOWS风格用户界面包括窗口、
5、尺寸框、横向滚动条、纵向滚动条以及各种类型的按钮。我们可以先分别设计出窗口类、尺寸框类、横向滚动条类、纵向滚动条类以及各种类型的按钮类,然后设计用户界面类; 再如:沙发床可以由沙发和床类多重继承而来,而沙发和床可以由家具类单重继承而来。 圆柱体可以由圆和柱体继承而来。,5.4.1 多继承的声明,格式: class 派生类名:继承方式1 基类名1,继承方式n 基类名n / 派生类新增的数据成员和成员函数 ; 说明:缺省的继承方式:私有 如class c:public a,b,5.4.2 多继承的构造函数与析构函数,多继承构造函数定义形式: 派生类名(参数总表):基类名1(参数表1),基类名2(参
6、数表2),基类名n(参数表n) / 派生类新增成员的初始化语句 ,构造函数的执行顺序:先基类,再派生类, 基类构造函数的执行顺序:在声明派生类时所指定的基类的顺序,与派生类构造函数中所定义的成员初始化列表的各项顺序无关。 析构函数的执行顺序:与构造函数相反。,#include class base1 protected: int a1; public: base1(int aa):a1(aa) void print1() couta1=a1endl; base1(); class base2 protected: int a2; public: base2(int aa):a2(aa) voi
7、d print2() couta2=a2endl; base2();,class derived:public base1,public base2 protected: int b; public: derived(int aa1,int aa2,int bb):base1(aa1),base2(aa2) b=bb; derived() void print() coutb=bendl; void main() derived myb(1,2,3); myb.print1(); myb.print2(); myb.print();,说明: 对基类成员的访问必须是无二义性的 基类成员访问时二义
8、性的解决: 前面加上基类:,5.4.3 虚基类,1.为什么要引入虚基类,例5.14 虚基类的引例。 #include class base public: base() a=5; coutbase a=aendl; protected: int a; ; class base1:public base public: base1() a=a+10; coutbase1 a=aendl; ; class base2:public base public: base2()a=a+20; coutbase2 a=aendl; ;,class derived:public base1,public b
9、ase2 public: derived() coutbase1:a=base1:aendl; coutbase2:a=base2:aendl; ; main() derived obj; return 0; 程序运行结果如下:: base a=5 base1 a=15 base a=5 base2 a=25 base1:a=15 base2:a=25,base base base1 base2 derived 图5-2 非虚基类的类层次图,2. 虚基类的概念,虚基类的声明是在派生类的声明过程,其语法形式如下: class 派生类名:virtual 继承方式 类名 / ,例5-15 虚基类的使
10、用。 #include class base public: base( ) a=5; coutbase a=aendl; protected: int a; ; class base1: virtual public base public: base1( ) a=a+10; coutbase1 a=aendl; ; class base2: virtual public base public: base2( ) a=a+20; coutbase2 a=aendl; ;,class derived:public base1,public base2 public: derived( ) c
11、outderived a=aendl; ; main( ) derived obj; return 0; 程序运行结果如下:: base a=5 base1 a=15 base2 a=35 derived a=35,base base1 base2 derived 图5-3 虚基类的类层次图,3. 虚基类的初始化,在使用虚基类机制时应该注意以下几点: (1) 如果在虚基类中定义有带形参的构造函数,并且没有定义缺省形式的构造函数,则整个继承结构中,所有直接或间接的派生类都必须在构造函数的成员初始化表中列出对虚基类构造函数的调用,以初始化在虚基类中定义的数据成员。 (2) 建立一个对象时,如果这个
12、对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。该派生类的其他基类对虚基类构造函数的调用都自动被忽略。,(3) 若同一层次中同时包含虚基类和非虚基类,应先调用虚基类的构造函数,再调用非虚基类的构造函数,最后调用派生类构造函数; (4) 对于多个虚基类,构造函数的执行顺序仍然是先左后右,自上而下; (5) 对于非虚基类,构造函数的执行顺序仍是先左后右,自上而下; (6) 若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数。,说明: Virtual 和public顺序无关 一个类可以是某些派生类的虚基类的同时,也是另一个类的非虚基类。,5.5 赋值兼容规则,所谓赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。这样,公有派生类实际上就具备了基类的所有特性,凡基类能解决的问题,公有派生类也能解决。,例如,下面声明的两个类: class Base ; class Derived:public Base ; 根据赋值兼容规则, 以下几种情况是合法的:,(1) 可以用派生类对象给基类对象赋值。例如: Base b; Derived d; b=d; 这样赋值的效果是,对象b中所有数据成员都将具有对象d中对应数据成员的值。 (2) 可以用派生类对象来初始化基类的引用。例如: Derive
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 为档案质量控制工作提供了坚实制度
- 大班硬笔书法奖惩制度
- 街道办事处工作奖惩制度
- 上下工序互检奖惩制度
- 团队考勤管理及奖惩制度
- 药店员工奖惩制度及流程
- 酒吧安全卫士奖惩制度
- 学校安全生产奖惩制度
- 门店巡检奖惩制度范本
- 公司奖惩制度三合一制度
- (正式版)SH∕T 3006-2024 石油化工控制室设计规范
- 住房按揭借款合同
- 二手车交易合伙协议
- 2024年江苏信息职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 板材行业销售渠道分析
- 2024地面用晶体硅光伏组件环境适应性测试要求第1部分:一般气候条件
- 合同税率变更补充协议
- 教科版四年级下册科学全册教案
- 苏教版五年级下册数学 列方程解决两步实际问题 教案(教学设计)
- 人教版《体育与健康》水平二 跳跃单元作业设计
- 《煤气安全作业》培训教材
评论
0/150
提交评论