随笔-22  评论-7  文章-0  trackbacks-0

在程序中,当我们对多态类的基类指针使用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在运行时指向的实际类型。

VC默认不启动RTTI,即“运行时期类型识别”,如果在你的程序用到了RTTI,比如typeid,你必须明确告诉编译器启动RTTI,这样VC才能正确编译
选择菜单Project->settings->c/c++->category->c++ language,将Enable Run-Time Type Infomation(RTTI)选中
posted on 2010-11-08 09:23 楚天清秋 阅读(701) 评论(0)  编辑 收藏 引用 所属分类: C,C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理