C++继承机制.doc_第1页
C++继承机制.doc_第2页
C++继承机制.doc_第3页
C++继承机制.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

C+继承机制继承继承是类与类之间的一种关系定义:“类B继承类A”,或者说“类A派生类B”类B中除了自己定义的成员之外,还自动包括了类A中定义的数据成员与成员函数,这些自动继承下来的成员称为类B的继承成员。 一、继承的语法1、class 派生类名: 基类类名表public: 公有成员说明列表;protected: 受保护成员说明列表;private: 私有成员说明列表; ; 其中基类类名表的格式为:access 基类类名1, , access 基类类名n access为继承访问控制符,规定了派生类对基类的继承方式,可为public,private或者protected,继承访问控制符可省略,此时认为为private在protected后定义的是保护段,其中的数据成员或成员函数称为受保护成员:具有公有成员与私有成员的双重角色。2、一个类的受保护成员,对于其子孙类(派生类)的成员函数来说是公有的,对类本身及后代类之外定义的其他函数则是私有成员。 3、派生类可以重新定义基类的成员函数,覆盖基类的同名函数4.通过类名限定符在派生类中使用基类的同名成员二、继承访问控制规则公有继承(公有派生)、私有继承、保护继承访问控制基类成员访问控制在派生类中的访问控制publicpublicpublicprotectedprotectedprivate不可访问protectedpublicprotectedprotectedprotectedprivate不可访问privatepublicprivateprotectedprivateprivate不可访问一、 派生类对象的存储组织派生类的对象不仅存放了在派生类中定义的非静态数据成员,而且也存放了从基类中继承下来的非静态数据成员。 二、 类型兼容性1.赋值运算的类型兼容性类型的赋值兼容性规则:1) 允许将后代类的对象赋值给祖先类,但反之不成立。 例:BASE obj1; Y1 obj2; obj1 = obj2 ; / 把obj2中基类部分的内容赋给obj1 obj2 = obj1 ; 但此规则只适用于公有派生,只有公有派生类才能兼容基类类型2) 指向基类对象的指针也可指向公有派生类对象2.参数传递与对象初始化的类型兼容性与赋值运算类型兼容性相同A* p=q;/初始化A*p;P=q; /赋值继承与构造函数、析构函数一、 构造函数与析构函数的调用次序 1. 构造函数的调用次序 在创建一个派生类的对象时先调用其基类的构造函数再调用本类对象成员的构造函数最后才调用本类的构造函数2. 析构函数的调用次序 先调用本类的析构函数再调用本类对象成员的析构函数最后才调用其基类的析构函数二、 向基类构造函数传递实际参数给基类构造函数传递实际参数是通过向派生类构造函数传递实际参数以及初始化列表来间接实现传递的。 带初始化列表的派生类构造函数的一般形式派生类名 ( 参数表 ) : 基类名 ( 调用基类构造函数参数表 ) /派生类构造函数体 多重继承一、 多重继承多重继承:一个类由多个基类派生而来单继承: 一个类由单个基类派生而来多重继承的语法:class 派生类名: access 基类名1, , access 基类名n; 二、 多重继承的名字冲突问题名字冲突:指两个基类具有相同名字的成员时,在派生类中这个名字会产生二义性,即编译程序无法确定派生类的对象使用该名字时应调用哪一基类中的版本。 名字冲突的解决方法不同基类存在名字冲突的解决办法: 1)使用作用域运算符明确指明使用那个基类的成员函数 2)在派生类中重定义有名字冲突的成员(派生类和基类中的名字冲突)class DERIVED: public BASE1, public BASE2 public:void set(int x, int y) i = x; j = y;void show()cout i n; cout j n;三、 多重继承的构造函数和析构函数多个基类构造函数的调用次序:1)按基类在被继承时所声明的次序、从左到右依次调用; 2)与出现在派生类构造函数实现初始化列表中的次序无关。 重复继承一、 重复继承1. 基本概念定义:指一个派生类多次继承同一个基类C+中关于继承的限制不允许直接或间接让一个类继承自己不允许一个派生类直接继承同一个基类两次以上不允许一个基类既是直接基类又是间接基类2. 重复继承的两种类型复制继承:被多次重复继承的基类有多个实体副本共享继承:被多次重复继承的基类只有一个实体副本二、 重复继承的二义性问题若在继承时没有作特殊声明,此时采用的是复制继承,会导致重复继承的二义性问题。 class BASE public:int i;class BASE1: public BASE public:int j;class BASE2: public BASE public:int k;class DERIVED: public BASE1, public BASE2 public:int sum;解决二义性的方法1) 如不改变重复继承的方法(还是复制继承),则采用作用域运算符:明确指明采用哪个副本int main()DERIVED obj; obj.BASE1:i = 3; 2) 改用共享方式继承:用虚基类机制保证任何派生类中只提供一个基类的副本三、 虚基类 定义:虚基类是当基类被继承时,在基类的继承访问控制关键字前面加上关键字virtual来定义,虚基类用于实现共享继承. class BASE public:int i;class BASE1: virtual public BASE public:int j;class BASE2: virtual public BASE public:int k;虚基类的构造函数与析构函数对虚基类构造函数的调用总是先于普通基类的构造函数。 虚基类的唯一副本只被初始化一次C+中构造函数的调用次序(1) 最先调用虚基类的

温馨提示

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

最新文档

评论

0/150

提交评论