0%

C++之继承

继承(Inheritance)是面向对象程序设计语言中一个非常重要的机制. 这个机制可以让子类继承父类的属性和功能, 并加入一些子类特有的属性和功能.

基类的定义和普通类一样, 也有自己的成员变量和成员函数. 也可以定义一个空类作为基类, 但这样并没有任何意义. 只有已经定义了的类才能作为基类.

子类(派生类)的定义则需要在类名后加上":"和一个访问控制符, 然后加上所要继承的基类的名字, 这里的访问控制符默认为private, 可以省略. 子类定义的一般语法规则如下:

class 子类名: 访问控制符 基类名
{
    //子类成员声明
}

一个子类可以同时有多个基类, 这种情况称为多继承. 此外, 一个类从父类集成来的特性也可以被这个类的子类继承.

通常, 子类的生成可以分为3个步骤. 第一步是吸收基类成员, 子类包含了基类中除构造函数和析构函数以外的所有成员; 第二步是改造基类成员, 主要包括两个方面, 一方面基类成员的访问控制问题,另一个方面是对基类的成员变量和成员函数的覆盖问题; 第三步是添加子类的新成员.

访问控制符有三种类型, public, privateprotected. 使用不同访问控制符会导致基类成员在子类中的访问属性有所不同.

  1. public继承: 基类的public和protect成员的访问属性在子类中保持不变, 但是基类private成员不能被子类直接访问.

  2. private继承: 基类的public和protect成员都作为子类的私有成员, 基类的私有成员不能被直接访问. 也就是说, 在private继承中, 基类的一切成员对子类来说都是不可以直接访问的, 且无法往下继承.

  3. protected继承: 基本与private继承一样, 区别在于基类的public成员和protected成员都作为子类的protected成员, 并且不能往下继承.

由于构造函数和析构函数是不能被继承的, 因此下面将对子类的构造函数和析构函数进行说明. 构造子类对象时, 需要对基类的数据成员进行初始化. 因此, 参数表部分既要包含子类的初始化值, 也要包含基类的初始化值.

子类名::子类名(参数总表): 基类名1(参数表1), ... 基类名n(参数表n)
{
    //初始化语句
}

如果基类声明了带形参表的构造函数, 子类就应该声明构造函数.

子类的析构函数比较简单, 主要是要注意成员的清除顺序. 应首先对子类的成员进行清理, 然后对基类的成员进行清理.