C++模板类的继承2:普通类继承模板类

来源:互联网 发布:域名未授权解析 编辑:程序博客网 时间:2024/04/25 19:21
          在上一篇文章中,介绍了C++中模板类继承的实现。本文补充介绍如何从C++模板类中派生出一个普通类,或者说实现一个普通类A,继承至一个模板类B。

1.实现List基类(模板类)

#ifndef LIST_H#define LIST_H#include <iostream>using std::cout;using std::endl;enum Error_code { underflow, overflow, range_error, success, not_present,fail};const int max_list = 100;template <class List_entry>class List{// methods of List ADTpublic:List();int size() const;bool full() const;bool empty() const;void clear();void traverse(void(*vist)(List_entry&));  // Traverse every elements in the ListError_code retrieve(int position, List_entry &x) const;Error_code replace(int position, const List_entry& x);Error_code  remove(int position, List_entry& x);Error_code  insert(int position, const List_entry &x);protected:// The contiguous implementation is based on the arrayint count;List_entry entry[max_list];};// constructortemplate<class List_entry>List<List_entry>:: List(){count = 0;}/***** 其余代码略***********/#endif

2. 从模板类中继承一个普通类Ordered_list

// Ordered_list.h#ifndef ORDERED_LIST#define ORDERED_LIST#include "list.h"#include "Key.h"typedef Key Record;class Ordered_list : public List<Record> //注意这一行代码{   public:   Ordered_list();   Error_code insert(const Record &data);   Error_code insert(int position, const Record &data);   Error_code replace(int position, const Record& data);};#endif// Ordered_list.cpp#include "Ordered_list.h"Ordered_list::Ordered_list():List<Record>(){} //注意这一行代码Error_code Ordered_list::insert(const Record &data){int s = size();int position;for(position = 0; position < s; position++){Record list_data;retrieve(position, list_data);if (data <= list_data) break;}return List<Record>::insert(position,data);}Error_code Ordered_list::insert(int position, const Record &data){if(position<0||position>count)return range_error;Record list_data;    retrieve(position-1,list_data);if (data < list_data){return fail;}    retrieve(position+1,list_data);if (data > list_data){return fail;}return List<Record>::insert(position, data);}Error_code Ordered_list::replace(int position, const Record& data){    if(position<0||position>=count)return range_error;Record list_data;    retrieve(position-1,list_data);if (data < list_data){return fail;}    retrieve(position+1,list_data);if (data > list_data){return fail;}return List<Record>::replace(position, data);}


原创粉丝点击