第5章 继承与派生解析.ppt

  1. 1、本文档共82页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 5.6.3赋值兼容规则 在派生类对象和基类对象之间赋值时需要注意赋值的方向,即这些赋值操作需要满足赋值兼容规则。赋值兼容规则包括: (1)基类对象可以赋值给基类对象,也可以把派生类对象赋值给基类对象。 (2)基类指针可以指向基类对象,也可以指向派生类对象。 (3)基类引用可以指向基类对象,也可以指向派生类对象。 * 例如,有基类Base和其派生类Derived,可以定义相应的对象、指针: Base b1; Base *pb; Derived d1; 根据赋值兼容规则,在基类Base对象可以出现的任何地方都可以用派生类Derived对象来替代。 (1)派生类对象可以赋值给基类对象,即派生类对象中来自基类成员,逐个赋值给基类对象的成员: b1=d1; (2)派生类的对象也可以初始化基类对象的引用: Base rb=d1; (3)基类的指针赋值为派生类对象的地址: pb=d1; * 【例5.10】赋值兼容实例。 /* 05_10.cpp */ #includeiostream using namespace std; class Base //基类Base { protected: int member; public: Base() { member=0;} void Show() //共有成员函数 { coutBase::Show() :memberendl;} }; class Derived1:public Base //第1个派生类Derived1 { public: Derived1(int a) { member=a; } void Show() //重写共有成员函数Show { coutDerived1::Show() :memberendl; } }; * class Derived2:public Derived1 //第2个派生类Derived2 { public: Derived2(int a): Derived1(a) { } void Show() //重写共有成员函数Show { coutDerived2::Show() :memberendl; } }; void Test(Base *pb) //测试函数,用基类指针作参数 { pb-Show(); } void Test(Base br) //测试函数,用基类引用作参数 { br.Show(); } int main() //主函数 { Base b0; //基类Base对象 Derived1 d1(5); //派生类Derived1的对象 Derived2 d2(10); //派生类Derived2的对象 Base *pb0; //基类指针pb0 pb0=b0; //基类指针pb0指向基类对象b0 Test(pb0); b0=d1; //基类对象赋值为子类对象 Test(pb0); //测试输出 pb0=d1; //基类指针pb0指向基第一派生类Derived1的对象d1 Test(pb0); Test(d2); //第2派生类Derived2的对象d2的引用作参数传给Test函数 return 0; } * Base::Show() :0 Base::Show() :5 Base::Show() :5 Base::Show() :10 程序的运行结果为: * 5.6 虚基类 5.6.1 提出问题 在多继承关系中,如果某个派生类D 的多个基类(如类Bl 和B2 )派生自另一个公共基类B0 ,则在派生类对象中,会通过不同的继承路径多次得到基类B0 的成员,即同时存在多份基类B0 的成员。 通过派生类D 的对象访问这些成员时,会出现对这些成员的访问冲突。 为解决冲突问题可以使用成员名限定的方法来唯一标识某个成员所属的基类,但是这不能从根本上解决问题:派生类对象中存在基类成员的多个副本,如图5.8所示。 * 图5.8 多继承关系及派生类的成员构成UML图 * 5.6.2 虚基类的概念 为使得公共基类B0 在派生类D0 中只产生一份基类成员,则需要将这个共同基类B0 设置为虚基类,让基类Bl 和B2 从基类B0 虚拟继承,这时从不同的路径继承过来的同名数据成员在派生类中就只有一个副本。 同一个函数名也只有一个映射。这样就解决了同名成员的唯一标识问题。 使用虚基类,可以使公共基类的成员在其间接派生类中只保留一份。使用虚基类后,4 个类之间的关系如图5.9a所示,这时派生类中的成员如图5.9b所示

文档评论(0)

2299972 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档