私有继承、类模板
1.私有继承的派生类,基类的公有和保护成员都将成为派生类的私有成员,因此基类方法将不会称为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们。(即不继承接口),因此私有继承可以用于实现has-a关系。
2.has-a关系中一个类可以从多个类派生出来,这种继承叫多类继承
3.类模板的定义template <typename Type>
如
typedef unsigned long Item;
bool Stack::push(const Item &item);
可以改为
template <typename Type>;
bool Stack<Type>::push(const Type & item) //声明
...
Stack<int> kernels; //int型实现
Stack<string>colonels; //string型实现
4.模板的具体实现叫具体化或实例化,它的实现必须和模板的成员函数放在一起,不能单独放在一个独立的文件中。因此可以在头文件中包含模板和实现它。
模板类可以用作基类或组件类甚至其它模板类的类型参数,如:
template <class T>
class Array
{
private:
T entry;
...
};
template <class Type>
class GrowArray:pubilc Array<Type>{...} //继承
template <class Tp>
class Stack
{
Array<Tp> ar;
};
...
Array < Stack<int> > as; //组件
例如 ArrayTp< ArrayTp<int ,5>,10 > twodee; //包含十个元素的数组,每个元素都是一个包含5个Int的数组
等价于 int twodee[10][5];
5.成员模板:
模板可以用于做结构、类或模板类的成员,如下:
template <typename T>
class bets
{
private:
template <typename V>
class hold
{
private:
V val;
public:
hold (V v=0):val(v) { }
void show() const {cout <<val<<endl;
};
hold <T> q;
hold <int> n;
public:
beta(T t,int i): q(t),n(i) { }
template <typename U>
U blab (U u,T t) {return (n,Value() + q.Value() ) *u / t ; }
void Show() const {q.show(); n.show(); }
};