C++中的代码重用
14.1 包含对象成员的类
14.1.1 valarray类简介
14.1.2 Student类的设计
14.1.3 Student类示例
14.2 私有继承
14.2.1 Student类示例(新版本)
14.2.2 使用包含还是私有继承
14.2.3 保护继承
14.2.4 使用using重新定义访问权限
14.3 多重继承3
14.3.1 有多少Worker
14.3.2 哪个方法
14.3.3 MI小结
14.4 类模板
14.4.1 定义类模板
14.4.2 使用模板类
14.4.3 深入探讨模板类
14.4.4 数组模板示例和非类型参数
14.4.5 模板多功能性
14.4.6 模板的具体化
14.4.7 成员模板
14.4.8 将模板用作参数
14.4.9 模板类和友元
14.4.10 模板别名(c++11)
14.5 总结
C++提供了几种重用代码的手段。第13章介绍的公有继承能够建立is-a关系,这样派生类可以重用基类的代码。私有继承和保护继承也使得能够重用基类的代码,但建立的是has-a关系。使用私有继承时,基类的公有成员和保护成员将成为派生类的私有成员;使用保护继承时,基类的公有成员和保护成员将成为派生类的保护成员。
无论使用哪种继承,基类的公有接口都会成为派生类的内部接口。这有时候被成为继承实现,但不继承接口,因为派生类对象不能显式地使用基类的接口。因此,不能将派生对象看作是一种基类对象。由于这个原因,在不进行显式类型转换时,基类指针或引用不能指向派生类对象。
还可以通过开发包含对象成员的类来重用代码。这种方法被成为包含、层次化或组合,它建立的也是has-a关系。与私有继承和保护继承相比,包含更容易实现和使用。所以优先使用这种方式。然而,私有继承和保护继承比包含有一些不同的功能。例如,继承允许派生类访问基类的保护成员;还允许派生类重新定义从基类继承来的虚函数。因为包含不是继承,所以通过包含来重用类代码时,不能使用这些功能。
另一方面,如果需要使用某个类的几个对象,则用包含更适合。例如:
State类包含多个Country对象。
多重继承(MI)使得能够在类设计中重用多个类的代码。私有MI或保护MI建立has-a 关系,而公有MI建立has-a关系。MI会带来一些问题,即多次定义同一个名称,继承多个基类对象。可以使用类限定符来解决名称二义性问题,使用虚基类来避免继承多个基类对象的问题。但使用虚基类后,就需要为编写的构造函数初始化列表以解决
二义性问题。