is-a关系使用公有继承
has-a关系使用私有继承或者包含。
template<class T1,class T2>
class Pair {
private:
T1 a;
T2 b;
public:
T1& first();
T2& second();
T1 first()const { return a; }
T2 second()const { return b;}
Pair(const T1&aval,const T2&bval):a(aval),b(bval){}
Pair() {};
};
typedef Pair< Arrayint, Arrayint>PairArray;
template<class T1,class T2>
class wine :private PairArray
{
private:
string name;
int yrs;
public:
wine();
wine(const char* l, int y, const int yr[], const int bot[]);
wine(const char* l, int y);
void Getbottles();
void show();
string& Label();
int sum();
};
类名为Pair< Arrayint, Arrayint>,在定义类时只用写Pair.
template<class T1,class T2>
T1& Pair< T1, T2>::first()
{
return a;
}
template<class T1,class T2>
T2& Pair< T1, T2>::second()
{
return b;
}
模板成员函数的每个函数头将以相同的模板声明打头。
first有两种类型,一种返回引用,一种返回复制值。
pair类为wine类的私有成员,不能直接访问:
当Wine类与pair类为包含关系时:PairArray::first()[i];(包含将对象作为一个命名的成员)
当Wine类与pair类为私有继承时:PR.first()[i];(PR为Wine中的Pair类实例化名称)(私有继承将对象作为一个未命名的成员)