小众知识

首页 > 正文

关于运行时识别

一个项目,需要一个类型体系, 如:
  class object {
       object();
      virtual ~object();
  };

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


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

   一个是用现在的c++ RIIT:
             type1* tmp = dynamic_cast(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
        }

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

 

 sevecol 发表于:2003-08-22 15:11:26
得分:0 

性能的话,第二个应该是最好的。
表达上第一个最优雅


 zss6587 发表于:2003-08-22 15:11:57
得分:0 

我推荐使用第三种,想不想借用一下 Template Method模式 ? 

 zss6587 发表于:2003-08-22 15:14:04
得分:0 

我认为第三种方法性能上不比第二种差. 

 luohualiushui 发表于:2003-08-22 15:25:09
得分:5 

2,3两种方法都让类变大了,不好
我觉得用RIIT比较好,但是楼主的代码效率低了点
用typeid直接比较,效率应该会搞一些
if (typeid(temp)==typeid(type1))
{
 .............

 Mattary 发表于:2003-08-22 16:29:40
得分:0 

我觉得第一种方法在时间上有损失,第二,三种在空间上有损失,是不是有更好地办法? 

 zcchm 发表于:2003-08-22 17:06:22
得分:10 

优先考虑的应该是:这些类之间的关系。

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

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

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





 nsly 发表于:2003-08-22 19:48:41
得分:5 

我使用的是第三种和第一种的结合。

第一,不同的情况可能会不同对待。
第二,第三种在构造的时候不是很方便。 

 nsly 发表于:2003-08-22 19:53:28
得分:0 

另外,我认为在语言层面上已经支持dynamic_cast,为什么不直接使用? 

上一篇:请问在C++中,比较两个字符数组内容是否相等的函数是什么?(请说明格式)急,在线等待
下一篇:有关析构函数的问题

分享到: