1.概念引入
继承是软件复用的一种方式,通过继承,可以在吸收现各类的各种性能(即数据)的基础上,再加以定制或增强来创建新类。软件复用能够节省软件开发时间,鼓励人们复用经过验证、调用的高质量软件,使用系统开发更有效。
今天我将带来这几天对于面向对象编程中继承的理解。首先要告诉大家的是:基类是被继承的类,派生类是继承基类的类。
接下来区分一下“是一个”(is a)关系和“有一个”(has a)关系。
is a:此关系表示继承即派生类对象都可以看做基类对象,例如,汽车对象是交通工具据的对象,交通工具对象的所有属性和行为都可以在汽车对象中找到。
has a:此关系表示组成,在“有一个”关系中对象可以把其他类的一个或多个对象拿来作为自己的成员。例如,汽车对象中包含很多配件,有方向盘,有刹车踏板,有传动装置等。
2.继承访问限定语法
C++采用了三种继承方式:public继承,protected继承,private继承下表总结了每一种继承方式下,在派生类中对基类成员的访问性。
当采用public继承一个派生类时,基类的public成员成为派生类中public的成员,基类的protected成员成为派生类的protected成员。无论时通过public、protected和private继承时派生类禁止访问基类的private成员但是可以通过调用基类函数达到间接访问。
当采用protected继承一个派生类时,基类的public和protected都会成为派生类中的protected成员。
当采用private继承一个派生类时,基类的public和protected都会成为派生类中的private成员。
则根据之前引入的概念可知public满足“是一个(is a)”关系,protected和private继承满足“有一个(has a)”关系。
3.知识点总结:
1.基类的private不能被它的派生类直接访问,但是这些基类的private成员仍然得到了继承只不过被隐藏了起来。
2.如果基类数访问成员函数以及变量由private改为protected,则可以在派生类中直接访问。
优点:因为直接访问可以免去调用基类函数间接获取private数据,可以免去调用设置或获取成员函数的开销,所以继承protected数据成员会使程序的性能稍稍有所提高。
缺点:
(1)派生类会将无效的值赋给基类的protected数据,导致对象处于不一致的状态。
(2)派生类成员函数实现可能太依赖基类的实现,当使用了基类的protected数据时,如果修改了基类的实现那么同时还需要修改所有派生类。在这种情况下我们称程序是脆弱的,因为基类中的小小一个改动就会破坏派生类的实现。
3.构造函数与析构函数的调用顺序
当程序创建一个派生类对象时,派生类构造函数立即调用基类的构造函数,基类的构造函数的函数体开始执行,然后派生类的构造函数执行。如果这时的继承层次结构有多层,那么这一过程还将向上翻滚。而析构函数与构造函数调用顺序相反。
4.派生类不会继承基类的构造函数、析构函数和赋值运算符重载函数和友元函数。但是,派生类的构造函数、析构函数和赋值运算符重载函数可以调用基类的构造函数、析构函数和赋值运算重载函数。