LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1549|回复: 10

关于类属类的派生类是不是一定是类属类的问题.

[复制链接]
发表于 2003-7-2 10:38:59 | 显示全部楼层 |阅读模式
《面向对象程序设计基础》高等教育出版社
P282是有一句话:
    程序9。2。5则以类属类为基类,这时派生类必定也是类属类。派生类的形式类属参数表中必须包含基类的所有形式类属参数。

我认为是不正确的。

  1. 下面我给个例子(我自己思考出来的):
  2. quene.h:

  3. #include<stdio.h>
  4. template<class TYPE>
  5. class Queue{

  6. protected:
  7.         int head,tail,size;
  8.         int (*traver)(TYPE&);
  9.         TYPE* buf;
  10.        
  11. public:
  12.          Queue(int init_size,int (*init_traver)(TYPE&)){  
  13.                 size=init_size;
  14.                 buf=new TYPE[size];
  15.                 if(!buf){cerr<<"ERROR"<<endl;exit(0);}
  16.                 head=0;
  17.                 tail=0;
  18.                 traver=init_traver;
  19.         }
  20.         Queue(int (*init_traver)(TYPE&)){
  21.                 Queue<TYPE>(256,init_traver);
  22.         }

  23.         ~Queue(){
  24.         delete[] buf;
  25.         }
  26.        
  27.         int is_full(){
  28.                 if((tail+1)%size==head)return 1;
  29.                 return 0;
  30.         }

  31.         int is_empty(){
  32.                 if(head==tail)return 1;
  33.                 return 0;
  34.         }
  35.         int del(TYPE &elem){
  36.                 if(is_empty())return 0;
  37.                 elem=buf[head++];
  38.                 head%=size;
  39.                 return 1;
  40.         }
  41.         int add(const TYPE &elem){
  42.                 cerr<<"ADDING"<<endl;
  43.                 if(is_full()){cerr<<"FULL"<<endl;return 0;}
  44.                 //getchar();
  45.                 //buf[tail++]=elem;
  46.                 getchar();
  47.                 tail++;
  48.                 tail%=size;
  49.                 return 1;
  50.         }
  51.         int visit(){
  52.                 int cursor;
  53.                 cursor=head;
  54.                 while(cursor!=tail){
  55.                         cerr<<"TRAVERING"<<endl;
  56.                         traver(buf[cursor++]);
  57.                         cursor%=size;
  58.                 }
  59.         return 1;
  60.         }
  61. };
  62. 这是一个类属类。
  63. #include<iostream.h>

  64. #include "queue.hpp"



  65. struct Worker{

  66.         int status;

  67.         int timer;

  68.         };

  69. [color=red]class Miner: public Queue<struct Worker>{//注意!!![/color]



  70. public:

  71.         [color=red]Miner(int (*init_traver)(struct Worker&)):Queue<struct Worker>(init_traver){//注意!!![/color]

  72.         return ;

  73.         }

  74.         int ch_status(int status){

  75.                 buf[head].status=status;

  76.                 return 1;

  77.         }



  78.         int ch_time(long time){

  79.                 buf[head].timer=time;

  80.                 return 1;

  81.         }



  82.         int insert(struct Worker comer){

  83.                 int temp;

  84.                 temp=tail;

  85.                 if(is_full())return 0;



  86.                 for(;(temp!=head)&&buf[(temp-1)%size].timer>comer.timer; ){

  87.                         buf[temp]=buf[(temp-1)%size];

  88.                         temp=(temp-1)%size;

  89.                 }

  90.                 buf[temp]=comer;

  91.                 tail=(tail+1)%size;

  92.                 ln++;

  93.                 return 1;

  94.         }

  95.         int status(){

  96.                 return buf[head].status;

  97.         }

  98.         long time(){

  99.                 return buf[head].timer;

  100.         }

  101. };
复制代码


大家看看。
quene是一个类属类。
Miner是quene的派生类。但是,Miner是一个普通类。
派生类根本没有形式类属参数表!
关键是,我在构造Miner是已经把quene实例化了。
我觉得编程一定要懂得内在的原理!
(不知道在其它书上是不是已经解决了这个问题??)

辛苦!改了N次才保留缩进,去掉表情符号!!!
发表于 2003-7-2 11:53:06 | 显示全部楼层
可是严格说这是从template的一个实例派生出来的类,不是从template
派生出来的。
 楼主| 发表于 2003-7-2 12:16:21 | 显示全部楼层
是啊。不这样做是解决不了的啊。
因为信息不够。
这样做至少也提供了一条途径吧。
发表于 2003-7-2 17:39:55 | 显示全部楼层
类属类是什么意思先

偶好久没有研究语法了
可否告知一起研究
 楼主| 发表于 2003-7-2 18:11:57 | 显示全部楼层
就是template,模板
发表于 2003-7-2 21:52:45 | 显示全部楼层
其实明白了以后,怎么解释都容易。但是没有明白以前,看到别人写的文字就发懵。我想,那本书打算说的是下面这种情况:


  1. template <class T>
  2. class Base
  3. {
  4.     T _data;
  5. public:
  6.     Base(const T& data)
  7.     {
  8.         _data = data;
  9.     };
  10. };


  11. template <class T>
  12. class Derived : public Base<T>
  13. {
  14. public:
  15.     Derived(const T& data)
  16.         : Base<T>(data)
  17.         {
  18.         }
  19. };

  20. int
  21. main()
  22. {
  23.     Derived<int> myobject(0);
  24.     return 0;
  25. }
复制代码


你开始贴出来的程序的 Miner 类呢,就相当于我这个简单例子里的 Derived 魔板的一个实例 Derived<int>。
对吗?
 楼主| 发表于 2003-7-3 11:01:09 | 显示全部楼层
其中有不同之处的.
1、我不用自己实例化了,
2、怎样继承是个问题。
3、我的Miner只处理一种数据类型,我为什么要用template?所以我就要在继承的时候实例化。
发表于 2003-7-3 11:45:32 | 显示全部楼层
我是这么理解的:
1、你实际上是早一点自己实例化了。
2、继承的时候有什么问题?
3、实例化化的类跟普通类没有什么不同,所以你实际上继承了一个普通的类。
 楼主| 发表于 2003-7-3 12:26:05 | 显示全部楼层
你不要对照我的例子,编一个看看.
发表于 2003-7-3 14:08:19 | 显示全部楼层
没有说模板类的子类就一定要是模板类啊

你可以实例化它
也可以继续使用模板的形式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表