在程序中,当我们对多态类的基类指针使用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 ;
}
#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)选中