C++的一个主要目标是实现代码重用。公有继承是实现这种目标的机制之一,还有其它机制分别为组合和私有或保护继承。
组合、私有或保护继承可以用于实现has-a关系;多重继承能够从两个或更多的基类中派生出新的类;类模板能使用通用的术语定义类,然后使用模板来创建对特定类型定义的特殊类。
1.组合
valarray
类简介
该类用于处理数值,它支持将数组中所有元素相加以及在数组中找出最大最小值的操作。
模板特性意味着声明对象时,必须指定具体的数据类型。
class Student
{
private:
string name;
valarray<double> scores;
...
}
在Student
类中,可以使用string
和valarray<double>
的公有接口来访问和修改name
和scores
对象;但是在类的外面,只能通过Student
类的公有接口来访问和修改name
和scores
对象。
这被称为Student
类继承了其成员对象的实现,但是没有继承接口。
而在公有继承中,类可以继承接口,可能还有实现。
class Student
{
private:
//将typedef放在类的私有部分,保证只有在类的实现中可以使用
typedef valarray<double> ArrayDb;
string name;
ArrayDb scores;
public:
//成员列表初始化包含的对象
Student():name("Null Student"), scores() {}
//使用explicit避免显式转换
explicit Student(const string & s):name(s),scores() {}
}
对于继承的对象,构造函数在成员初始化列表中使用类名来调用特定的基类构造函数;对于成员对象,则使用成员名。
C++要求在构建对象的其他部分之前,先构建继承对象的所有成员对象。因此,如果省略初始化列表,C++将使用成员对象所属类的默认构造函数。
在初始化列表中,项目被初始化的顺序为被声明的顺序(如上文中必须先name
再scores
),而不是它们在初始化列表中的顺序。