先看下面的第一段程序:
//这个是基类
template<class T>
class BasedClass
{
private:
T data ;
public:
BasedClass() ;
...
};
//这个是继承类
template<class T>
class InheritClass : public BasedClass<T>
{
private:
T temp ;
public:
InheritClass(T dat1,T dat2) ;
...
};
//这个是继承类的构造函数
template<class T>
InheritClass<T>::InheritClass(T dat1,T dat2)
{
BasedClass<T>(dat1) ; //这个是基类的构造函数,注意这里写的是基类的类模板名
temp = dat2 ;
}
注意上面程序用红色标注的地方。两点:
1、在写继承类时,如果基类是模板类,则在关键字public或者protected或private后面接的是基类的类模板名,不是类名。这里要特别注意
2、在写继承类的构造函数时,应该首先调用基类的构造函数对继承的数据进行初始化。这时在调用基类的构造函数时,基类构造函数的名字是基类的类模板名,不是类名,这一点也要注意。
再看下面的第二段程序:
如果两个类有联系,比如链表类的一个结点类和该链表类之间是有依赖关系的或者一颗树类和树的结点类也是有依赖关系的。以树类来说:树类可能要访问结点类的私有成员,这时我们应该怎么做呢?我们可以将树类声明为结点类的友元函数。具体可参考下面的例子:
// BinStree depends on TreeNode
template <class T>
class BinSTree;
// declares a tree node object for a binary tree
template <class T>
class TreeNode
{
private:
// points to the left and right children of the node
TreeNode<T> *left;
TreeNode<T> *right;
public:
...
// BinTree needs access to left and right
friend class BinSTree<T>;
};
注意两点:
1、在定义结点类TreeNode之前,我们声明了树类BinSTree。且在声明的时候用的是树类的类名,不是模板类名。虽然前面头template关键字。
2、在节点类的public部分,我们将树类BinStree声明为结点类的友元函数。这时我们使用的是类模板。要注意和在结点类定义之前的声明是不一样的。前面的声明只是说我们有这样的一个树类,这时应该用类名。而在public里面有friend关键字,这时应该要用类模板名。