网站大量收购独家精品文档,联系QQ:2885784924

第8章继承与多态性重点.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8.1.5 赋值兼容性 赋值兼容性是把派生类中从基类继承来的成员赋给基类的对应成员,使用时注意: (1)赋值兼容性是单向赋值,即只能是派生类向基类赋值;而不能基类向派生类赋值,因为派生类的新增成员将得不到值。 (2)赋值兼容性只有在公有派生时才成立,因为非公有派生会改变成员的的访问属性。 (3)指向派生类对象的基类指针通常只能使用派生类对象中从基类继承来的成员,而不能访问派生类中的新增成员,除非该新增成员是虚函数。 通常情况下,一个类中不允许出现名称相同的成员,但派生类中可能出现多个名称相同的成员,这是允许的。因为它们来自不同的类,即作用域不同。 8.2.1 冲突概念 1. 冲突 派生类中同时存在来自不同类的,名称相同的成员的现象称为冲突。主要有两种情况: (1)来自不同基类的同名成员同时出现在派生类中; (2)从基类继承来的成员与派生类中的新增成员同名。 来自不同类的同名成员可以用“类名::”加以区分。 8.2 冲突 类C有两个x,分别用A::x和B::x表示;有3个y,可以分别用A::y、B::y和C::y 表示。 8.2.1 冲突概念 基类A a x y 派生类C 新 c 增 y 基类B b x y a x y A b x y B 2.支配规则 当派生类中新增的成员与从基类继承来的成员同名时,在没有使用作用域运算符时缺省指代的是派生类中新增的同名成员,这种优先关系称为支配规则。 其中C::y 可直接表示为y。 8.2.1 冲突概念 例8-7 冲突与支配规则。 class A{ protected: int a,x,y; public: A(){ a=1; x=2; y=3; } }; class B{ protected: int b,x,y; public: B(){ b=4; x=5; y=6; } }; class C:public A,public B{ int c,y; public: C(){ c=7; y=8; } void show() { couta=a“,b=b“,c=c\n; coutA::x=A::x“,B::x=B::x\n; coutA::y=A::y“,B::y=B::y“,C::y=y\n; } }; void main() { C t; t.show(); } t 新 c 7 增 y 8 a 1 x 2 y 3 A b 4 x 5 y 6 B 程序输出为: a=1,b=4,c=7 A::x=2,B::x=5 A::y=3,B::y=6,C::y=8 注:A、B、C三个类中均有缺省的构造函数。 8.2.1 冲突概念 没有冲突时,可直接使用派生成员和新增成员。 多基类继承时的冲突,必须在冲突成员前用基类名和作用域运算符指出其所属的类,否则会产生二义性。 若从基类继承来的派生成员与派生类中的新增成员重名,缺省引用的是新增成员。 因冲突产生的二义性通常可以通过类名和作用域运算符解决,但同一个基类经过多级继承后会出现用“类名::”无法解决的冲突。 A::a 派生 类D 派生 类B A::a 基类A a 派生 类C A::a A::a 类D中就会出现类A的两个拷贝,但不能写成B::a、C::a或B::A::a、C::A::a。 C++语言使用虚拟继承的方法,解决从不同途径继承来的同名成员出现重复拷贝的问题。 1. 虚基类概念与定义 虚拟继承时,将共同基类设置为虚基类。即定义派生类时,用关键字virtual说明基类。其定义格式为: class 派生类名: virtual 派生方式 基类名 { 新增成员列表 } 或 class 派生类名: 派生方式 virtual 基类名 { 新增成员列表 } 关键字virtual可以放在派生方式前,也可以放在派生方式后。 8.2.2 虚基类 1. 虚基类的构造函数 从虚基类直接或间接继承的派生类构造函数的头部,必须列出虚基类构造函数的调用,除非虚基类有缺省的构造函数。 例8-8 虚基类的定义及构造函数调用。 程序设计 ①定义虚基类A,由类A派生出类B和类C。 ②由类B和类C派生出类D。 源程序代码 #includeiostream.h class A{ protected: int a; public: A(int x){ a=x; cout调用类A构造函数\n;} }; 8.2.2 虚基类 class B:public virtual A{ protected: int b; public: B(int

文档评论(0)

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

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

1亿VIP精品文档

相关文档