第五章继承和派生类 继承和派生类是面向对象程序设计的一个重要 组成部分。本章要求掌握单一继承、多重继承 两义性、支配规则和虚基类的概念;掌握派生 类的访问权限,构造函数与析构函数的调用顺 序;理解两义性及其支配规则,训练运用作用 域分辨符,掌握赋值兼容规则
第五章 继承和派生类 继承和派生类是面向对象程序设计的一个重要 组成部分。本章要求掌握单一继承、多重继承、 两义性、支配规则和虚基类的概念;掌握派生 类的访问权限,构造函数与析构函数的调用顺 序;理解两义性及其支配规则,训练运用作用 域分辨符,掌握赋值兼容规则
、继承和派生的基本概念: 继承、基类与派生类 继承:继承就是创建一个具有别的类的属性和行为的 新类的能力。就是从已有的对象类型出发,建立一种 新的对象类型,使它继承(具有)原对象特点和功能。 类的派生:是一个过程,就是通过特殊化已有的类来 建立新类的过程。(我们想象水稻学家们试验出一个 水稻新品种的情况,通过已有的种类,创出新的种类, 而这个新类又继承了原来品种的一些特点和属性,并 有自己新的属性和特点)
一、继承和派生的基本概念: 继承、基类与派生类: 继承:继承就是创建一个具有别的类的属性和行为的 新类的能力。就是从已有的对象类型出发,建立一种 新的对象类型,使它继承(具有)原对象特点和功能。 类的派生:是一个过程,就是通过特殊化已有的类来 建立新类的过程。(我们想象水稻学家们试验出一个 水稻新品种的情况,通过已有的种类,创出新的种类, 而这个新类又继承了原来品种的一些特点和属性,并 有自己新的属性和特点)
基类和派生类:如同上面的例子,原有的水稻品种就是"基类 "p新生的品种就叫做"派生类",新的品种"遗传"了原来品种 的各种基因,在这里,一个派生类自动地将基类的成员做为 已的成员,我们叫做"继承",很形象地,基类和派生类又 可叫做"父类"和"子类
基类和派生类:如同上面的例子,原有的水稻品种就是"基类 ",新生的品种就叫做"派生类",新的品种"遗传"了原来品种 的各种基因,在这里,一个派生类自动地将基类的成员做为 自己的成员,我们叫做"继承",很形象地,基类和派生类又 可叫做"父类"和"子类"
性质约束和性质扩展: 类派生(继承)是面向对象程序设计方法和c+语言最重要的 继承常用来表示类属关系,不能将继承理解为构成关系, 比如我们假设昆虫是一个类,而蝴蝶也是一个类,这两个 类是派生(继承)的关系,基类是昆虫,派生类是蝴蝶,这 是一个类属的关系,蝴蝶类是属于昆虫类的,但不能理解 为构成关系,蝴蝶这个类不是昆虫这个类中的成员的简单 包括,它还有其他一些独特的成员,而原来的成员也被重 新定义,这些都表明蝴蝶类是昆虫类的一个分支而不是构 成关系
性质约束和性质扩展: 类的派生(继承)是面向对象程序设计方法和c++语言最重要的 特征之一。 继承常用来表示类属关系,不能将继承理解为构成关系, 比如我们假设昆虫是一个类,而蝴蝶也是一个类,这两个 类是派生(继承)的关系,基类是昆虫,派生类是蝴蝶,这 是一个类属的关系,蝴蝶类是属于昆虫类的,但不能理解 为构成关系,蝴蝶这个类不是昆虫这个类中的成员的简单 包括,它还有其他一些独特的成员,而原来的成员也被重 新定义,这些都表明蝴蝶类是昆虫类的一个分支而不是构 成关系
从上面的例子来理解,从现存类中派生出新类时,可以对派生 类做如下几种变化: 新的成员变量; 2.可以增加新的成员函数; 3.可以重新定义已有的成员函数; 4可以改变现有成员的属性(访问权限)。 以上允许派生类所作的变化是很广泛的,由此我们可以用派生 类对其从父类继承来的的性质进行限制或删除(这就是性质约 束),也可以对父类的性质进行增加(这就是性质扩展)
从上面的例子来理解,从现存类中派生出新类时,可以对派生 类做如下几种变化: 1.可以增加新的成员变量; 2.可以增加新的成员函数; 3.可以重新定义已有的成员函数; 4.可以改变现有成员的属性(访问权限)。 以上允许派生类所作的变化是很广泛的,由此我们可以用派生 类对其从父类继承来的的性质进行限制或删除(这就是性质约 束),也可以对父类的性质进行增加(这就是性质扩展)
、单一继承 C+中有两种继承:单一继承和多重继承。多重继承的派生类 各个基类 单一继承是本章的重点, 单一继承就是只通过一个基类产生派生类。这个派生类的基 类只有一个,它从基类继承所有的成员
二、单一继承 C++中有两种继承:单一继承和多重继承。多重继承的派生类 有多个基类 单一继承是本章的重点, 单一继承就是只通过一个基类产生派生类。这个派生类的基 类只有一个,它从基类继承所有的成员
单一继承的一般形式为: css派生类名:访问控制基类名{ 成员说明列表 public 成员说明列表
单一继承的一般形式为: class 派生类名:访问控制 基类名{ private: 成员说明列表 public: 成员说明列表 };
关于”类的保护成员": 个派生类的基类成员是私有成员的时候,虽然基类的成 被派生类继承,但C艹+规定,这个派生类仍不能直接访问 勺私有成员,只能通过基类的公有成员作为接口去访问, 这是符合数据封装的思想的。基类的私有成员在派生类中就 是"不可访问成员 为了能够在派生类中访问基类所有成员,又使数据封装得 以实现,就引入了"保护成员"的概念。就是在类的定义中, 用 protected来说明类成员,而不是用" private",这样的成 员就是类的保护成员。保护成员对于派生类的成员函数而 言是公有成员,而对于其他函数就仍是私有成员
关于"类的保护成员" : 当一个派生类的基类成员是私有成员的时候,虽然基类的成 员已被派生类继承,但C++规定,这个派生类仍不能直接访问 基类的私有成员,只能通过基类的公有成员作为接口去访问, 这是符合数据封装的思想的。基类的私有成员在派生类中就 是"不可访问成员" 。 为了能够在派生类中访问基类所有成员,又使数据封装得 以实现,就引入了"保护成员"的概念。就是在类的定义中, 用protected来说明类成员,而不是用"private",这样的成 员就是类的保护成员。保护成员对于派生类的成员函数而 言是公有成员,而对于其他函数就仍是私有成员
对于单一继承,主要要掌握的是其中的"访问控制(访问权限) 和赋值兼容规贝 派生类定义中的访问控制(权限)设为 public(公有)时, 类的派生就称为"公有派生",它有如下特点: 1.基类的公有成员在派生类中仍然是公有的。 2.基类的保护成员在派生类中仍然是保护的。 3.基类的不可访问和私有成员在派生类中仍然是不可访问 的 因为派生是没有限制的,也就是说,派生类也可做为基类派生 新的类,所以在派生类中有一种”不可访问成员"级别存在, 要么就是基类的不可访问成员要么就是基类的私有成员
对于单一继承,主要要掌握的是其中的"访问控制(访问权限)" 和赋值兼容规则: 当在派生类定义中的访问控制(权限)设为public(公有)时, 这个类的派生就称为"公有派生",它有如下特点: 1.基类的公有成员在派生类中仍然是公有的。 2.基类的保护成员在派生类中仍然是保护的。 3.基类的不可访问和私有成员在派生类中仍然是不可访问 的。 因为派生是没有限制的,也就是说,派生类也可做为基类派生 新的类,所以在派生类中有一种"不可访问成员"级别存在,它 要么就是基类的不可访问成员要么就是基类的私有成员
#include class a DU void setx(int a)(x=a;) void sety(int b)iy=b;) int getxo const( return x;) int getyO const( return y;) protected X, private int y;
#include class A { public: void setx(int a) { x = a; } void sety(int b) { y = b; } int getx() const { return x; } int gety() const { return y; } protected: int x; private: int y;};