关于运行时识别

Mattary 2003-08-22 02:58:23
一个项目,需要一个类型体系, 如:
class object {
object();
virtual ~object();
};

class type1 : public object
{
type1();
~type1();
}


现在要在runtime为识别一个对象的真实类型,
我现在有三个方案来识别一个对象类型,

一个是用现在的c++ RIIT:
type1* tmp = dynamic_cast<type1*>(obj),
if (tmp) ...

一个是在根类里加一个字段:
int __uuid, 不同的对象类型不同的值
for example: type1 contructor:
type1() : object(T_type1)
{
}

一个是用virtual function: int get_type(); 根类是虚的, 不同的子类返回不同的值,
for example:
int type1::get_type() {
return Istype1
}

这三种方式都能实现我要求的功能,但是不知道那一个性能最好。

...全文
66 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
nsly 2003-08-22
  • 打赏
  • 举报
回复
另外,我认为在语言层面上已经支持dynamic_cast,为什么不直接使用?
nsly 2003-08-22
  • 打赏
  • 举报
回复
我使用的是第三种和第一种的结合。

第一,不同的情况可能会不同对待。
第二,第三种在构造的时候不是很方便。
zcchm 2003-08-22
  • 打赏
  • 举报
回复
优先考虑的应该是:这些类之间的关系。

最不推荐用的是第二种:“类型域”,无论从代码的弹性,优雅来看,都不宜使用。

第一种不够优雅,会造成代码肥大,但是效率高些。

第三中是推荐的用法,代码优雅,富有弹性,就是如果你再添加一种类型的话,不需对原有代码进行任何修改。但是效率低些。




Mattary 2003-08-22
  • 打赏
  • 举报
回复
我觉得第一种方法在时间上有损失,第二,三种在空间上有损失,是不是有更好地办法?
luohualiushui 2003-08-22
  • 打赏
  • 举报
回复
2,3两种方法都让类变大了,不好
我觉得用RIIT比较好,但是楼主的代码效率低了点
用typeid直接比较,效率应该会搞一些
if (typeid(temp)==typeid(type1))
{
.............
}
zss6587 2003-08-22
  • 打赏
  • 举报
回复
我认为第三种方法性能上不比第二种差.
zss6587 2003-08-22
  • 打赏
  • 举报
回复
我推荐使用第三种,想不想借用一下 Template Method模式 ?
sevecol 2003-08-22
  • 打赏
  • 举报
回复
性能的话,第二个应该是最好的。
表达上第一个最优雅

64,282

社区成员

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

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