面向对象程序设计9_第1页
面向对象程序设计9_第2页
面向对象程序设计9_第3页
面向对象程序设计9_第4页
面向对象程序设计9_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、多 重 继 承多重继承是指一个派生类有两个以上的直接基类。例如:助教可以从学生和初级技术人员中派生出来。 例如:class B0 public: int v; void fun( ); ;1 class B1:public B0 public: int v1; ; class B2:public B0 public: int v1; class B:public B1,public B2 public: void fun();注意:一定要找到一个唯一的作用域才合法。 main() B obj; obj.fun(); /合法 obj.v1=3; /?非法 obj.B1:v1=4; /合法 obj

2、.B1:fun( ); /合法 obj.B2:fun( ); /合法2B0B1B0B2B3我们考虑一个联名的免费支票帐户如何构造? 系统现支持 基本帐户Account ;联名帐户 joinAccount;免费支票帐户 freeCheck;class Account /类名 public : void deposit(double amt); /存钱 double withdraw(double amt);/取钱 .;4class joinAccount:public Account public: bool transfer(Account &s,double amt); . ;class f

3、reeCheck:public Account public: void fee( ); bool withdraw(double amt); ;5 class jtFrCheck:public joinAccount,public freeCheck public: .略 ;考虑 若建立了一个联名免费支票帐户S 那么若要往该帐户上存钱,转帐,和取钱,该如何实现?6 S.joinAccount:deposit(10.0); / ?S.freeCheck:withdraw(200.0); /? S.withdraw(100.0); / ? S.deposit(100.0); / ?Account

4、AccountjoinAccfreeCheckjtFrCheck7S中包含了两个基本帐户Account,这显然是不合理的,同时也容易造成数据的不一致性。 在C+中,我们考虑使用虚基类来解决以上问题。8虚基类一个类不能多次说明为一个派生类的直接基类,但可以不止一次的成为间接基类,这样就导致了一些问题(如前所述)C+中的虚基类就是为了避免基对象复制而设计的机制。 简单的声明virtual基对象,它的实例不会在一个派生对象中复制。9 虚基类的声明是在在派生类的声明过程中进行的,其语法形式: class 派生类名:virtual 继承方式 基类名注意:虚基类的关键字只对紧跟其后的基类起作用。声明了虚基

5、类后,虚基类的成员在进一步派生过程中和派生类维护同一个数据拷贝。10class L class A:public L public: . int a; ; ; class B:public L . ; class Q:public A,public B void f( )a=2; /非法! ;11class L class A: virtual public L public: . int a; ; ; class B: virtual public L . ; class Q:public A,public B void f()a=2; /合法! ;12考虑如何修改联名免费支票帐户。Acco

6、untfreeCheckjoinAccountjtFrCheck13 class joinAccount: virtual public Account /*class body*/ ; class freeCheck: virtual public Account /*class body*/ ; class jtFrCheck:public joinAccount,public freeCheck/*class body*/14S.deposit(10.0); /合法 考虑如何改进联名免费支票帐户类。 使用户使用统一的业务接口 (例如:取钱,存钱,转帐等)15虚基类 (二)虚基类对象的初始

7、化虚基类构造函数的调用次序规定: 1虚基类的构造函数在非虚基类之前调用。 2 若同一层次包含多个虚基类,则按说 明的次序调用 3 虚基类并未改变派生类的初始化顺序, 初始化顺序仍然遵循 前父亲,再客人,后自己16例如: class X:public Y,virtual public Z.; main( ) x obj; 初始化顺序:Z( ) Y( ) X( )再考虑: base1basebase1level1level2top17 class level1:public base1,virtual public base class body.; class level2:public bas

8、e1,virtural public base class body.; class top:public level1,public level2; 问:当初始化建立一个top对象实例时,建立过程的初始化顺序?base base1level1base1level2top18 若修改为class level1:virtual public base1,virtual public base class body.; class level2:virtual public base1,virtural public base class body.; class top:public level1,public level2; 问:当初始化建立一个top对象实例时,建立过程的初始化顺序?19basebase1level1level2topbase1baselevel1level2top20若修改为class level1:virtual public base1,virtual public base class body.; class level2:virtual public base1,virtural

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论