摘要
继承是c++语言一个重要的机制,该机制自动地为一个类提供来自另一个类的操作和数据结构,这使得程序员只需在新类中定义已有的类中没有的成分来建立一个新类。
继承解释
继承性是面向对象程序设计最重要的特征,可以说,不掌握继承就不等于掌握类和对象的精华,所以说继承是C++中很重要的一部分。
通过继承,我们可以用原来的数据类型来定义一个新的数据类型,定义的新类型既有原来数据中的成员,也能自己添加新的成员
我们一般把原来的数据类型称为基类或者父类,新的数据类型为派生类,或者子类,在本篇博客中Base为基类,Deriver为派生类;
具体得到了那些成员,这得由两个方面决定:
- 继承方式
-基类成员的访问权限
继承的分类
单继承
在继承中箭头所指向的地方是有派生类指向基类;
在继承中继承方式有3中,刚刚上面只写了一个public的共有继承;
●public 表示公有继承
●private 表示私有继承
●protected 表示保护继承
多继承
类C会同时拥有类A和类B的特性(属性和方法,也就是两个类的所有成员)。
派生类的构成
派生类的组成一般就两部分,一部分是从基类继承过来的,第二部分是自己特有的;
所以在单继承中我的示意图Derive比Base的图大点,有存放自己特色的空间;
主要注意的是多继承中空间的分布:
在多继承中靠派生类近的基类属于先声明的,所以数据在派生类中最先被保存;
所以说,在多继承中,派生类的数据模型和继承顺序有很大关系
三种继承方式
我们在前面学类的时候就知道:public,protected,private的访问权限
访问方式 | 类里面 | 类外面 |
public | 允许访问 | 允许访问 |
protected | 允许访问 | 不允许访问 |
private | 允许访问 | 不允许访问 |
这三种访问权限,在继承方式后也有所改变了
- 在public继承中,派生类访问基类的private成员时就会报错;
- 在protected继承中在派生类中可以访问基类中的protected成员,但是在main函数中_pub和_pro都不能被访问了;
如果你想要成员能在函数内部被访问,在函数外面不能被访问就用protected继承,可以说protected就是为继承而生的
- 在私有继承中,从基类继承下来的东西全部就变为了派生类私有的,所以你在外部完全访问不了,或许有人认为在外部访问不了和protected继承好像没什么区别,你从再次创建一个派生类来访问它的protected成员时是可以访问的,但是private成员就访问不了;
总结一下三种继承方式
继承方式 | 基类的public成员 | 基类的protected成员 | 基类的private成员 | 继承引起的访问控制关系变化概括 |
public继承 | 仍为public成员 | 仍为protected成员 | 不可见 | 基类的非私有长远在子类的访问属性不变 |
protected继承 | 变为protected成员 | 变为protected成员 | 不可见 | 基类的非私有成员都为子类的保护成员 |
private继承 | 变为private成员 | 变为private成员 | 不可见 | 基类中的非私有成员都称为子类的私有成员 |
在继承中不管是单继承还是多继承,都要注明继承方式,如果不注明在class中默认为private继承,在struct中默认public继承
友元函数、静态成员函数的继承
友元函数
在类的学习中,我们都了解了友元,友元可以访问指定类的私有和受保护的自定义成员,如果不是指定的成员,则不能被访问
友元类
(1)友元函数不是类成员函数,所以不能被继承;
(2) 友元关系是单向的,不具有交换性;
若B类是A类的友元,不一定A类就是B类的友元
(3)友元关系不能被传递,若B类是A类的友元,C类是B类的友元,C类不一定是A类的友元
友元注意事项
a、友元函数可访问类的私有成员,但不是类的成员函数;
b、友元函数不能用const修饰;
c、友元函数可以在类定义的任何地方声明,不受类访问限定符限制;
d、一个函数可以是多个类的友元函数;
e、友元函数的调用与普通函数的调用和原理相同;
f、友元关系不能继承,基类的友元对派生类的成员没有特殊的访问权限。如果基类被授予友元关系,则只有基类具有特殊的访问权限。该基类的派生类不能访问授予友元关系的类。