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在运行时指向的实际类型。