设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
编程开发讨论区 —— LinuxSir.cn
›
Linux 程序设计专题讨论
›
关于类属类的派生类是不是一定是类属类的问题. ...
1
2
/ 2 页
下一页
返回列表
查看:
1549
|
回复:
10
关于类属类的派生类是不是一定是类属类的问题.
[复制链接]
lordbyorn
lordbyorn
当前离线
积分
889
IP卡
狗仔卡
发表于 2003-7-2 10:38:59
|
显示全部楼层
|
阅读模式
《面向对象程序设计基础》高等教育出版社
P282是有一句话:
程序9。2。5则以类属类为基类,这时派生类必定也是类属类。派生类的形式类属参数表中必须包含基类的所有形式类属参数。
我认为是不正确的。
下面我给个例子(我自己思考出来的):
quene.h:
#include<stdio.h>
template<class TYPE>
class Queue{
protected:
int head,tail,size;
int (*traver)(TYPE&);
TYPE* buf;
public:
Queue(int init_size,int (*init_traver)(TYPE&)){
size=init_size;
buf=new TYPE[size];
if(!buf){cerr<<"ERROR"<<endl;exit(0);}
head=0;
tail=0;
traver=init_traver;
}
Queue(int (*init_traver)(TYPE&)){
Queue<TYPE>(256,init_traver);
}
~Queue(){
delete[] buf;
}
int is_full(){
if((tail+1)%size==head)return 1;
return 0;
}
int is_empty(){
if(head==tail)return 1;
return 0;
}
int del(TYPE &elem){
if(is_empty())return 0;
elem=buf[head++];
head%=size;
return 1;
}
int add(const TYPE &elem){
cerr<<"ADDING"<<endl;
if(is_full()){cerr<<"FULL"<<endl;return 0;}
//getchar();
//buf[tail++]=elem;
getchar();
tail++;
tail%=size;
return 1;
}
int visit(){
int cursor;
cursor=head;
while(cursor!=tail){
cerr<<"TRAVERING"<<endl;
traver(buf[cursor++]);
cursor%=size;
}
return 1;
}
};
这是一个类属类。
#include<iostream.h>
#include "queue.hpp"
struct Worker{
int status;
int timer;
};
[color=red]class Miner: public Queue<struct Worker>{//注意!!![/color]
public:
[color=red]Miner(int (*init_traver)(struct Worker&)):Queue<struct Worker>(init_traver){//注意!!![/color]
return ;
}
int ch_status(int status){
buf[head].status=status;
return 1;
}
int ch_time(long time){
buf[head].timer=time;
return 1;
}
int insert(struct Worker comer){
int temp;
temp=tail;
if(is_full())return 0;
for(;(temp!=head)&&buf[(temp-1)%size].timer>comer.timer; ){
buf[temp]=buf[(temp-1)%size];
temp=(temp-1)%size;
}
buf[temp]=comer;
tail=(tail+1)%size;
ln++;
return 1;
}
int status(){
return buf[head].status;
}
long time(){
return buf[head].timer;
}
};
复制代码
大家看看。
quene是一个类属类。
Miner是quene的派生类。但是,Miner是一个普通类。
派生类根本没有形式类属参数表!
关键是,我在构造Miner是已经把quene实例化了。
我觉得编程一定要懂得内在的原理!
(不知道在其它书上是不是已经解决了这个问题??)
辛苦!改了N次才保留缩进,去掉表情符号!!!
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
viper
viper
当前离线
积分
443
IP卡
狗仔卡
发表于 2003-7-2 11:53:06
|
显示全部楼层
可是严格说这是从template的一个实例派生出来的类,不是从template
派生出来的。
回复
支持
反对
使用道具
举报
显身卡
lordbyorn
lordbyorn
当前离线
积分
889
IP卡
狗仔卡
楼主
|
发表于 2003-7-2 12:16:21
|
显示全部楼层
是啊。不这样做是解决不了的啊。
因为信息不够。
这样做至少也提供了一条途径吧。
回复
支持
反对
使用道具
举报
显身卡
无双
无双
当前离线
积分
1799
IP卡
狗仔卡
发表于 2003-7-2 17:39:55
|
显示全部楼层
类属类是什么意思先
偶好久没有研究语法了
可否告知一起研究
回复
支持
反对
使用道具
举报
显身卡
lordbyorn
lordbyorn
当前离线
积分
889
IP卡
狗仔卡
楼主
|
发表于 2003-7-2 18:11:57
|
显示全部楼层
就是template,模板
回复
支持
反对
使用道具
举报
显身卡
viper
viper
当前离线
积分
443
IP卡
狗仔卡
发表于 2003-7-2 21:52:45
|
显示全部楼层
其实明白了以后,怎么解释都容易。但是没有明白以前,看到别人写的文字就发懵。我想,那本书打算说的是下面这种情况:
template <class T>
class Base
{
T _data;
public:
Base(const T& data)
{
_data = data;
};
};
template <class T>
class Derived : public Base<T>
{
public:
Derived(const T& data)
: Base<T>(data)
{
}
};
int
main()
{
Derived<int> myobject(0);
return 0;
}
复制代码
你开始贴出来的程序的 Miner 类呢,就相当于我这个简单例子里的 Derived 魔板的一个实例 Derived<int>。
对吗?
回复
支持
反对
使用道具
举报
显身卡
lordbyorn
lordbyorn
当前离线
积分
889
IP卡
狗仔卡
楼主
|
发表于 2003-7-3 11:01:09
|
显示全部楼层
其中有不同之处的.
1、我不用自己实例化了,
2、怎样继承是个问题。
3、我的Miner只处理一种数据类型,我为什么要用template?所以我就要在继承的时候实例化。
回复
支持
反对
使用道具
举报
显身卡
viper
viper
当前离线
积分
443
IP卡
狗仔卡
发表于 2003-7-3 11:45:32
|
显示全部楼层
我是这么理解的:
1、你实际上是早一点自己实例化了。
2、继承的时候有什么问题?
3、实例化化的类跟普通类没有什么不同,所以你实际上继承了一个普通的类。
回复
支持
反对
使用道具
举报
显身卡
lordbyorn
lordbyorn
当前离线
积分
889
IP卡
狗仔卡
楼主
|
发表于 2003-7-3 12:26:05
|
显示全部楼层
你不要对照我的例子,编一个看看.
回复
支持
反对
使用道具
举报
显身卡
无双
无双
当前离线
积分
1799
IP卡
狗仔卡
发表于 2003-7-3 14:08:19
|
显示全部楼层
没有说模板类的子类就一定要是模板类啊
你可以实例化它
也可以继续使用模板的形式
回复
支持
反对
使用道具
举报
显身卡
下一页 »
1
2
/ 2 页
下一页
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表