转载请注明出处:http://blog.youkuaiyun.com/enyusmile/article/details/47070051
本章内容包括:
- has-a关系
- 包含对象成员的类
- 模板类valarray
- 私有和保护继承
- 多重继承
- 虚基类
- 创建类模板
- 使用类模板
- 模板的具体化
通常,包含,私有继承和保护继承用于实现has-a关系,即新的类将包含另一个类的对象.
类模板使我们能够使用通用术语定义类,然后使用模板来创建针对特定类型定义的特殊类.
14.1 包含对象成员的类
14.1.1 valarray类简介
- valarray类是由头文件valarray支持的.valarray被定义为一个模板类,以便能够处理不同的数据类型.
14.1.2Student类的设计
- 通常,用于建立has-a关系的C++技术是组合(包含),即创建一个包含其他类对象的类.
- 接口和实现:使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口.不继承接口是has-a关系的组成部分.
- 对于has-a关系来说,类对象不能自动获得被包含对象的接口是一件好事.
14.1.3 Student类示例
- 程序清单14.1 studentc.h
- 可以用一个参数调用的构造函数将用作从参数类型到类类型的隐式转换函数;但这通常不是好主意.
- 使用explicit关闭隐式转换.
- C++和约束:C++包含让程序员能够限制程序结构的特性—使用explicit防止单参数构造函数的隐式转换,使用const限制方法修改数据,等等.这样做的根本原因是:在编译阶段出现错误优于在运行阶段出现错误.
- 1.初始化被包含的对象.
- 对于继承的对象,构造函数在成员初始化列表汇总使用类名来调用特定的基类构造函数.对于成员对象,构造函数则使用成员名.
- C++要求在构建对象的其他部分之前,先构建继承对象的所有成员对象.因此,如果省略初始化列表,C++将使用成员对象所属类的默认构造函数.
- 初始化顺序:当初始化列表包含多个项目时,这些项目被初始化的顺序为他们被声明的顺序,而不是它们在初始化列表中的顺序.例如,假设Student构造函数如下:
Student(const char * str,const double * pd,int n)
: score