在基类中定义一个可以在继承类中重新定义其值的常量的标准方法是什么?

yiyuan 2006-08-20 06:40:31
呵呵,话有点绕。

我在基类中有一个函数,这个函数使用一个常量(比如超时的时间)。其各个继承类中要把这个常量设置为不同的值(比如有的类是5秒超时,有的类是10秒超时),基类的函数不需要改变。请问完成这一功能的标准方法是什么?

我现在的方法是在基类中设置const常量,派生类设置static const常量,在构造函数中将static const常量赋值给基类的const常量。不知道这样是不是标准方法?这样做当然是可以,但当设置的常量数量较多时,需要写的代码也较多,不知道有没有更方便容易的方法完成这个功能?

比如在派生类中定义和基类相同名字的static const常量但值不同可以实现这个功能吗?或者还有什么其它方便的方法?
...全文
364 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2006-08-20
  • 打赏
  • 举报
回复
我觉得如果有一个量,在同一族或同一类的对象之间访问它时可能返回不同的值,那么直接用公开成员变量的方法来提供它本来就很不OO。:P
yiyuan 2006-08-20
  • 打赏
  • 举报
回复
zenny_chen(ACE Intercessor)所说的方面就是我上面所说的方法。我主要是觉得在派生类中会有两个常量表示同一个值和意思,看着很别扭。

lass Child : public Base
{
public:
static const long MY_TIME_OUT = 5; // 单独写出来以后方便修改

Child(unsigned long tmo) : Base(MY_TIME_OUT)
{
// Add your code here.
}
};

于是在派生类中,就会有MY_TIME_OUT和基类的time_out表示同一个值,有点不爽。。。虽然只是看起来。。。如果按steedhorse(晨星) 的方法,倒是就可以解决这个问题。

基类指针应该不是问题吧,当生成类时,基类的值被派生类初始化,所以后面即使使用基类的指针,值也应该是派生类的那个值吧。

我本来的打算就是因为值是常量,所以就不用虚函数多花时间了。但看上去似乎不大完美。。。可能还是用虚函数的方法比较好。
晨星 2006-08-20
  • 打赏
  • 举报
回复
哦,或许我想多了。

但从楼主的描述来看,我感觉那究竟还是不是个“常量”都有待争论,呵呵。
晨星 2006-08-20
  • 打赏
  • 举报
回复
那不就结了,说到底还得靠虚函数。
至于是否直接从const变量上返回及其初始化问题只是每个对象自己的实现细节。
a_b_c_abc4 2006-08-20
  • 打赏
  • 举报
回复
但那样的话,如果是基类的指针指向子类的对象(或基类的引用引用到子类的对象)时怎么办?就直接用基类的?
=========================
没问题的,当基类的指针指向子类,调用到子类重写的虚函数,这个虚函数中访问到的常量也是子类中初始化的那个,因为传第过去的是子类对象的指针。
lei001 2006-08-20
  • 打赏
  • 举报
回复
虚函数
zenny_chen 2006-08-20
  • 打赏
  • 举报
回复
呵呵,可能是你没理解楼主的意思,他要得解决方案可能没你想得那么复杂。

楼主所说的大概是指访问超时的父类成员方法子类不需要去重写,该常量对外部也不需要公开。
晨星 2006-08-20
  • 打赏
  • 举报
回复
但那样的话,如果是基类的指针指向子类的对象(或基类的引用引用到子类的对象)时怎么办?就直接用基类的?

“可以直接取用”就意味着“并不需要通过函数”吗?这又是什么道理呢?
a_b_c_abc7 2006-08-20
  • 打赏
  • 举报
回复

是啊,在构造函数的初始化列表中初始化为多少,它就是多少。

支持zenny_chen
zenny_chen 2006-08-20
  • 打赏
  • 举报
回复
To 楼主:

不需要啊。

class Base
{
private:
const unsigned long time_out;

public:

Base(unsigned long tmo) : time_out(tmo)
{
// Add your code here...
}

void SomeFunc(void)
{
// You may use the member time_out here...
}
};


class Child : public Base
{
public:

Child(unsigned long tmo) : Base(tmo)
{
// Add your code here.
}
};
yiyuan 2006-08-20
  • 打赏
  • 举报
回复
好像还没有我的方法好,这样要写的代码更多了,虚函数还会白花时间。因为值是常量,本来就可以直接取用,并不需要通过函数。
晨星 2006-08-20
  • 打赏
  • 举报
回复
我觉得满足楼主要求的最好的方法是基类应该定义一个:
virtual int getTimout() const;
然后每个子类都要实现它,具体的方法就看子类自己了。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧