继承---复用已经定义的操作
当一个类沿用或定制了它的唯一基类的数据结构和成员函数时,它使用了单继承。这就建立了一种体系,类似于一种科学分类法。每一层都是对上一层的细化。类型继承是OOP的精华之一,这个概念在C语言中确实不存在。
关键概念:继承
从一个类派生另外一个类,使前者所有的特性在后者中自动可用。它可以声明一些类型,这些类型可以共享部分或全部以前所声明的类型。它也可以从多个基类类型中共享一些特征。
继承通常在概念上提供越来越多的细化。一般从较为简单的基类派生出更为明确的派生类。它既可裁剪,也可以增加可用的操作。
C语言中的类型,它们显示了继承与C语言中的类型模型是如何相关的。
C语言中的类型
组合类型
标量类型
标量类型:
数值类型
枚举
指针
数值类型:
整数类型
实数类型
对C语言的类型体系稍作抽象,可进行类似分析,如下所示。
*C语言中的所有类型要么是组合类型(composite type,如数组、结构等,它们由相同的更小的元素组成),要么是标量类型(scaler type)。标量类型具有一个特性,即它的每个值都是原子值(并非由其他类型所组成的)
*数值类型继承了标量类型的所有特性,它们另外增加了一个特性,就是它们可以记录算术量
*整数类型继承了数值类型的所有特性,此外它们还拥有了自己的独有特性,它们它们都是整数(没有小数部分)char也属于整数类型,它的取值范围较小(-128~127)。
C语言并不允许程序员创建一等公民(与内置类型同一级别)的新类型,继承了其他数据类型的属性为数极少。OOP的一个重要部分就是推断出你的应用程序中抽象数据类型的体系结构。C++创造的且C语言无法通过正当途径轻易实现的主要新奇玩意儿就是继承。继承允许程序员使类型体系结构显式化,并利用它们之间的关系来控制代码。
C++如何进行继承
继承在两个类之间(而不是两个函数之间)进行。
基类的例子如下:
class Fruit {
public:
peel();
slice();
juice();
private:
int weight, calories_per_oz;
};
派生类的例子如下:
class Apple : public Fruit {
public:
void make_candy_apple(float weight);
void bob_for(int tub_id, int number_of_attempts);
};
对象声明的例子如下:
Apple teachers;
继承的语法看上去令人感到不舒服。派生类的名字后面跟一个冒号,然后是基类的名字。这种形式非常简洁,它并不提供太多提示,告诉我们哪个是基类哪个是派生类,而且它并不传递任何跟类型说明有关的信息。它并不是建立在现有的C语言惯用法的基础上,所以传统经验也帮不了我们。
不要把在一个类内部嵌套另一个类与继承混淆。嵌套只是把一个类嵌入到另一类的内部,它并不具有特殊的权限,跟被嵌套的类也没有什么特殊的关系。嵌套通常用于实现容器类(这是实现一些数据结构的类,如链表、散列表、队列等)。现在C++增加了模板(template)这个特性,它也用于实现容器类。
继承表示派生类是基类的一个变形,它们之间如何相互访问,则是由许多详细的语义来表示。与嵌套类(一个较小的对象是一个较大对象的许多组成部分之一)不同,继承表示一个对象是一个更为普通的父对象的类型。