valarray 类的 sum()方法,可以在Student类的声

valarray 类的 sum()方法,可以在Student类的声明中声明一个sum()方法,然后像下面这样定义该方法:
double Student :: sum() const // public Student method

// use privately-inherited method

return std: :valarray<double>: : sum ();

这样 Student 对象便能够调用 Student :: sum(),后者进而将 valarray<double> :: sum()方法应用于被包含
的valarray 对象(如果ArrayDb typedef在作用域中,也可以使用ArrayDb而不是std :: valarray<double>)。
另种方法是,将函数调用包装在另一个函数调用中,即使用…个using声明(就像名称空间那样)
来指出派生类可以使用特定的基类成员,即使采用的是私有派生。例如,假设希望通过 Student 类能够使
用valarray的方法min()和max(),可以在 studenti.h的公有部分加入如下using声明:
class Student : private std :: string, private std: :valarray<double>

public:
using std :: valarray<double> :: min;
using std: :valarray<double> :: max;

上述using声明使得 valarray<double> :: min()和 valarray<double> :: max()可用,就像它们是Student的公
有方法 样:
cout << "high score: " << ada[i].max() << endl;
注意,using声明只使用成员名 -- 没有圆括号、函数特征标和返回类型。例如,为使Student类可以
使用 valarray的 operator[]()方法,只需在Student类声明的公有部分包含下面的 using声明:
using student: :valarray<double> :: operator(]:
这将使两个版本(const和非const)都可用。这样,便可以删除Student :: operator[]()的原型和定义。
using声明只适用于继承,而不适用于包含。
有一种老式方式可用于在私有派生类中重新声明基类方法,即将方法名放在派生类的公有部分,如下
所小:
class Student : private std :: string, private std: :valarray<double>

public:
std :: valarray<double> :: operator[]; // redeclare as public, just use name

14.3

这看起来像不包含关键字using的using声明。这种方法已被摒弃,即将停止使用。因此,如果编译器
支持using声明,应使用它来使派生类可以使用私有基类中的方法。

多重继承

MI描述的是有多个直接基类的类。与单继承一样,公有MI表示的也是is-a关系。例如,可以从 Waiter
类和Singer 类派生出 SingingWaiter 类:
class SingingWaiter: public Waiter, public Singer { ... }:
请注意,必须使用关键字public来限定每一个基类。这是因为,除非特别指出,否则编译器将认为是
私有派生:
class SingingWaiter: public Waiter. Singer ( ... }: // Singer is a private base
正如本章前面讨论的,私有MI和保护MI可以表示has-a关系。Student类的studenti.h实现就是一个
这样的范例。下面将重点介绍公有MI。
MI可能会给程序员带来许多新问题。其中两个主要的问题是:从两个不同的基类继承同名方法;从两