posts - 225, comments - 62, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

关于运行时类型识别typeid

Posted on 2006-05-07 13:28 魔のkyo 阅读(2762) 评论(1)  编辑 收藏 引用 所属分类: Programming

在程序中,当我们对多态类的基类指针使用typeid,就可以在运行时确定指针指向对象的实际类型,并输出对象类型的名字。

#include  < cstdlib >
#include 
< iostream >
#include 
< typeinfo >
using   namespace  std;

class  B{
public :
    
virtual   void  fun(){}
};

class  D: public  B{
public :
    
void  fun(){}
};

int  main()
{
    B 
* p;
    D ob;
    p
=& ob;
    cout
<< " typeid(*p).name()= " << typeid( * p).name() << endl;
    
if (typeid( * p) == typeid(D))
        cout
<< " typeid(*p)==typeid(D) " << endl;
    cout
<< " typeid(p).name()= " << typeid(p).name() << endl;
    
if (typeid(p) == typeid(B * ))
        cout
<< " typeid(p)==typeid(B*) " << endl;
    system(
" pause " );
    
return   0 ;
}

这段code在VC++6.0中编译时,提示如下
warning C4541: 'typeid' used on polymorphic type 'class B' with /GR-; unpredictable behavior may result
编译后运行时错误。不知是不是此版本的VC++不符合C++标准?

在Devcpp(g++)中编译运行得到的结果是
typeid(*p).name()=1D
typeid(*p)==typeid(D)
typeid(p).name()=P1B
typeid(p)==typeid(B*)
说明用typeid作用于*p得到的的确是D类型,而用typeid作用于p得到的依然是B类的指针类型

如果typeid被作用于非多态类指针,那么我们得到的是指针被声明的类型,也就是说,此时typeid并不会返回指针所指向对象的实际类型。
如果将class B中的virtual去掉,在编译运行得到的结果是
typeid(*p).name()=1B
typeid(p).name()=P1B
typeid(p)==typeid(B*)

由此可见,在任何时刻都可以用基类指针指向派生类对象,而用typeid(*p)确定p指向的对象时,只当基类为多态类时才能真正确定p在运行时指向的实际类型。

Feedback

# re: 关于运行时类型识别typeid  回复  更多评论   

2006-05-12 18:32 by 魔のkyo
在询问zhuyun老师之后得到了解答:
选择菜单Project->settings->c/c++->category->c++ language,将Enable Run-Time Type Infomation(RTTI)选中
VC默认不启动RTTI,即“运行时期类型识别”,如果在你的程序用到了RTTI,比如typeid,你必须明确告诉编译器启动RTTI,这样VC才能正确编译
只有注册用户登录后才能发表评论。