# 继承
继承是面向对象程序设计中最重要的一个概念。
# 基础概念
类用于指定对象的形式,是一种用户自定义的数据类型,它是一种封装了数据和函数的组合。类中的数据称为成员变量,函数称为成员函数。
类可以被看作是一种模板,可以用来创建具有相同属性和行为的多个对象。
继承允许我们依据另一个类来定义一个类,当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。
# 对象的创建
以下实例我们使用关键字 class 定义 Box 数据类型:
class Box
{
public:
double length; // 盒子的长度
double breadth; // 盒子的宽度
double height; // 盒子的高度
};
基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面的语句声明了类 Box 的两个对象:
Box Box1 = Box(); // 等价于 Box Box1,通过 . 访问成员,不需要手动释放内存
另外,也可以在堆上创建对象,语法如下:
Box* Box2 = new Box(); // 通过 -> 访问成员,需要手动释放内存
创建对象的时候,其实是需要在内存中开辟空间的(使用 new,就在堆上开辟空间,如果没有使用 new,就栈上开辟空间):
- 如果类中是没有属性的,对象占用的空间大小也不是 0,而是 1;
- 如果类中是有属性的,所有的属性占用的空间大小的和。
# 访问权限
类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private。
公有(public)成员在程序中类的外部是可访问的。
私有(private)成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有当前类和友元函数可以访问私有成员。
受保护(protected)成员变量或函数与私有成员十分相似,但有一点不同,protected(受保护)成员在当前类和派生类(即子类)中是可访问的。
一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。
# 继承类型
公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
保护继承(protected):当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。
# 多重继承
多继承即一个子类可以有多个父类,它继承了多个父类的特性。语法如下:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
其中,访问修饰符继承方式是 public、protected 或 private 其中的一个,用来修饰每个基类,各个基类之间用逗号分隔。
# 初步的疑惑
在定义一个类时,在类的声明中直接写出方法体和单独定义方法之间,两者有什么区别?