第11章 继承
11.1 What is inheritance?(什么是继承?)
继承的作用:在已有类的基础上构造新类
这个新的类有或继承已有类的数据成员和成员函数,也可以添加新的数据成员和成员函数
这个已有的类就称为基类。 这个新类则称为派生类。
基类没有做任何改动,仅仅是作为生成派生类的基础。
这称为可重用性(基类被重用),可重用性也是面向对象编程的主要目标。
派生类也能作为基类,再派生出其他的类,这样就形成了一个类的层次结构。
11.2 Inheritance syntax(继承语法)
首先定义基类,然后再定义派生类。
派生类:继承创建相关类的层次结构(类型)共享代码和接口。 代码重用
基类的默认构造函数会自动调用派生类。
构造函数调用顺序:先基类,后派生类
析构函数调用顺序:先派生类,后基类
派生类可以拥有和基类同名的数据成员和成员函数,将基类中对应的成员屏蔽
11.3 Passing arguments to a base classconstructor(向基类的构造函数传递实参)
1.从键盘输入中使用构造函数初始化数据成员 为了让一个对象在被创建时就被初始化,
需要使用一个带有形参列表的构造函数。
2.创建一个派生类的对象时,应注意基类也会调用它的构造函数去构造一个基类对象。
3.就像前面的程序里那样,基类的默认构造函数会在派生类中自动调用。
4.当派生类的对象有初始化值的时候,基类对象的初始化会通过派生类构造函数中的初始化列表完成。
11.4 Protected class members(受保护的类成员)
- 关键字private 和 public用来控制对类的数据成员和成员函数的访问。
派生类的成员函数不能访问基类的私有数据成员和成员函数,从而保证了信息隐藏的原则。
- 实际中,在基类和派生类之间共享数据会更方便一些,所以C++ 提供了第三种访问控制级别protected.。
它允许派生类(并且只允许派生类)访问被指定为protected 的基类成员。
- private 类型的基类成员,在基类之外都不能被访问,即使在派生类中也不能访问。
- protected 类型的成员在基类和基类的任何一个派生类中都可以被访问。
- public类型的成员(通常是成员函数)在程序的任何部分都可以被访问。
- 派生类中基类成员的访问权限也可以在声明派生类时指定。
公有继承指定被继承的成员在派生类中拥有和在基类中相同的访问权限。
如果用关键字protected 替换public,那么基类中所有的public成员在派生类中都会变成protected成员。
11.5 继承的类型:public、protected和private
基类中的protected 成员在派生类中仍为protected。
私有继承是用关键字private来指定的。
使用私有继承时,基类中的所有public 和protected 成员在派生类中都将变成private 成员。
无论是public、protected或private继承,基类的private成员在派生类中都是不可访问的。
11.6 Composition(组合)
继承描述了类与类之间的“a -kind-of”关系。
类与类之间还存在另外一种关系—“has-a”,又被称为组合关系。
在C++中这意味着一个类的对象可以由其他类的对象组成。
11.7 Multiple inheritance(多重继承)
C ++允许多个类作为基类,从而允许构造如类c是类a的子类,也是类b的子类。
11.8 Virtual base classes(虚基类)
这种情况下,d1和d2就要指定他们的基类为虚基类
class d1:virtual public b class d2:virtual public b
并且在创建d3的一个对象时,基类的构造函数仅被调用一次
1. 默认情况下,继承类型为private私有继承,但这通常不是我们需要的继承类型。
因此要确认使用了需要的继承类型,通常为public 公有继承。
2. 派生类自动继承基类所有的protected 和public 类型的数据成员,但并不自动继承所有的成员函数。
下面这些基类的成员函数不会被派生类继承:构造函数、析构函数、重载运算符、友元函数。
3. 如果基类有一个带有参数列表的构造函数,
那么派生类构造函数必须在它的初始化列表中显式调用基类的构造函数。
4. 关键字virtual 用来避免在派生类中重复继承protected和public类型的数据成员。