- 1、本文档共59页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章继承与多态性
C++程序设计语言 第 8 章 继承与多态性 第8章 继承与多态性8.1 继承与派生8.2 冲突8.3 虚函数与多态性8.4 习题 ● 实验 ● 课堂练习 通常情况下,一个类中不允许出现名称相同的成员,但派生类中可能出现多个名称相同的成员,这是允许的。因为它们来自不同的类,即作用域不同。 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 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.hclass 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 x,int y):A(y) { b=x; cout调用类B构造函数\n; }}; class C:virtual public A{protected: in
文档评论(0)