2.2.2 栈类模板衍生子类模板实例
类模板不仅可以用来生成类实例,还可以作为其他类或者类模板的基类。以上述栈类模板作为基类,衍生一个可以记录栈内所存数据总数的子类count_stack。同样,count_stack也是一个模板,可用于保存多种数据。
实现方法也很简单,在count_stack中增加一个整数型成员变量以记录栈内数据数,并重载push()和pop()函数以便适时更新该变量。这样一个子类模板代码如例2.3所示。
例2.3
- #include "stack.hpp"
-
- template<typename T=int>
- class count_stack : public my_stack<T>
- {
- typedef my_stack<T>base_type; // 非常有用的typedef
- unsigned size;
- public:
- count_stack() : base_type(), size(0) {}
-
- void push(T const &v) {
- base_type::push(v);
- size++;
- }
-
- void pop() {
- if (size > 0) {
- base_type::pop();
- size--;
- }
- }
-
- unsigned getSize() const {return size;}
- };
类模板的基类必须是某个类型,所以例2.3中类模板count_stack的基类应该写为my_stack<T>,即保存T型数据的my_stack类模板实例类型。这里是利用count_stack类模板的模板参数来定义my_stack的模板参数值。如果是普通类以类模板实例为基类,需要为基类模板给定明确的模板参数值,例如以下代码所示:
- class another_stack : public my_stack<char> {/* ... */};
至此,我们已经实现了一个完整可用的栈类模板。借助模板的力量,无论所需入栈的数据是整型、字符串还是用户自定义类型,都可以当场生成对应类型的栈模板实例供使用。类模板可以帮助软件开发者专注于数据结构的设计,而不需要考虑具体数据类型。不仅如此,借助模板这一自动生成代码的机制,原本需要庞大代码才能实现的想法都可以利用编译器自动实现,扩展了软件开发者的解决问题的思路。接下来,让我们循着单向链表的思路,实现一种可以保存不同数据类型的异质链表。