继承是面向对象程序设计中软件重用的关键技术,可以降低大型软件的开发难度
一、类是数据和操作的集合,通常有以下三种关系
1·has——a
在类成员中体现,即一个类中的数据成员是另一个已经定义好的类
2·use——a
在友元函数和对象传参实现,表现为类之间成员函数的相互联系
3·is——a
在原有类的基础上派生新类的方法,即是继承
继承分为单继承和多继承
也分为私有继承,公有继承,保护继承
二、继承方式的访问控制
Private继承:基类所有成员成为派生类的私有成员
Public继承:基类公有成员成为派生类公有成员,基类保护成员成为派生类保护成员,基类私有成员成为派生类私有成员
protected继承:基类公有和保护成员成为派生类保护成员,基类私有成员成为派生类私有成员
通过观察发现,无论以什么方式继承,基类的私有成员都只能成为派生类的私有成员,(私有财产神圣不可侵犯?)
基类的私有成员在派生类中不可见,但并不代表不存在,可以通过调用基类的成员函数来操作基类的私有成员
基类成员在所有派生类中具有作用域,可以通过作用域运算符访问(非基类私有成员)
在软件开发中,如果没有特别需求,继承通常为公有继承
三、继承方式的访问声明
C++中提供一种访问调节机制,可以让一些本在派生类不可见的成员变为可访问,也称访问声明
但访问声明不允许调整在派生类中降低或提升基类成员的可访问性,即访问声明调节只能对标基类中该成员定义的声明
例如:
如果基类A中有公有成员a,私有继承于A的类B可以将a在public下定义,但不能在protected下定义
除此之外,还有以下限制
1·仅调整成员名字的访问权限 如可以调整为int类型的成员a,而不能调整整个int 例如:在B中,public: A::a
而非int A::a
2·不能出现歧义,如基类和派生类重名成员不可调整权限,如基类有重载的不同访问域成员不能调整,同名的重载函数如果
有相同的定义域,将调整基类所有同名函数的访问域
四、对于重名成员的处理:
派生类和基类成员重名,优先访问派生类成员,屏蔽基类成员,可以通过作用域运算符加以区分
五、对于静态成员的访问:
以定义和继承时的访问权限为主
如果在基类定义为公有,而派生类私有继承,则在派生类不能公有访问,但不论是通过基类还是派生类,都是对同一静态成员进行操作
六、初始化
建楼先建基,派生类的初始化会先调用基类的构造函数
派生类的构造函数形式为:
构造函数名(变元表):基类(变元表),数据成员1(变元1),数据成员2(变元2){...}
七、多继承
一个派生类仅有一个基类为单继承,一个派生类有多个基类为多继承
语法
class C:public a,public b{}
在使用多继承时,可能会出现多基类问题
例如B,C派生于A,D派生于B,C,这时如果不在代码中显式的使用作用域运算符指出式从哪一个直接基类派生的成员,程序访问
就会出现二义性,此时称为非虚继承。为避免出现二异性,现提出虚继承的概念
八、虚继承
功能介绍:
当建立派生类D时,不再分别建立B,C的基类A,而是由virtual指引建立指向A的指针,这样就可以避免不再出现访问的二义性。
当然,一个类在类体系中可以作为虚基类或非虚基类,这取决于派生类对它的继承方式,而与基类本身的定义方式无关。