前言
上一章节主要是详细介绍了C++友元。不清楚的可以回顾一下哦。本章节主要针对于C++中的继承和派生做一个详细介绍。
继承和派生基本概念
继承
在 C++ 中,当定义一个新的类 B 时,如果发现类 B 拥有某个已写好的类A的全部特点,此外还有类A没有的特点,那么就不必从头重写类 B,而是可以把类A作为一个“基类”(也称“父类”),把类 B 写为基类 A 的一个“派生类”(也称“子类”)。这样,就可以说从类 A “派生”出了类 B,也可以说类 B “继承”了类 A。
派生
派生类是通过对基类进行扩充和修改得到的。基类的所有成员自动成为派生类的成员。所谓扩充,指的是在派生类中可以添加新的成员变量和成员函数;所谓修改,指的是在派生类中可以重写从基类继承得到的成员。
其实对于新手来讲继承和派生也没必要分的那么清楚!继承和派生写法上区别并不大。
例如在交通工具中,我们可以生成如下类:
继承基本写法
在 C++ 中,从一个类派生出另一个类的写法如下:
class 派生类名: 继承方式说明符 基类名{
...
};
继承方式说明符可以是以下三种:
-
public(公有继承)
-
private(私有继承)
-
protected(保护继承)
一般都使用 public。protected 或 private 方式很少用到。派生类对象占用的存储空间大小,等于基类对象占用的存储空间大小加上派生类对象自身成员变量占用的存储空间大小。如以下代码:
继承的难点解析之权限问题
继承方式说明符可以是以下三种:public(公有继承)private(私有继承)protected(保护继承)。不同的继承方式,父类中的属性和成员在子类中的权限是不同的,只要记住继承中权限限定词会加强父类属性在子类的中的权限,不同的继承方式的权限如下表:
尤其要注意的是无论什么继承方式,父类的私有属性是不能被子类使用的,都是不可访问状态。如下代码;
继承的难点解析之构造函数写法
我们在前面讲过,构造函数是负责构造对象的,一般用来初始化类的数据成员的,在继承中,子类除了要初始化自生类的成员,还必须初始化继承下来的数据成员,但父类中的成员只能调用父类的构造函数,所以子类的构造函数只能采用初始化参数列表的方式进行初始化,如一下代码:
有意思的是,当我们不想去这样做的时候,我们往往都会在父类中重载一个无参的构造函数,但是虽然我们子类没有写初始化参数列表,但是子类对象的创建前必须先调用父类的构造函数。如下代码:
多继承
多继承没什么太多难度,就是有多个父类,构造函数与权限也好基本上是和单继承是相同的,如下代码:
虚继承
在多继承和单继承中有一种继承叫做菱形继承,也可以叫做虚继承,我一般称之为龌龊继承,A类继承产生B和C类,然后B和C类多继承出D类,在B和C继承A的过程中要用虚继承,关系如下图:
主要是因为A的属性被B和C继承后,D中的具有两个备份,所以就直接用A的构造函数负责给A的属性初始化,如下实现代码:
尾言
本专栏作业:使用继承方式,实现形状类,到按钮类的实现过程,并且实现相应的鼠标点击事件。