wifecooky
学一点,记一点
C++博客
首页
新随笔
联系
聚合
管理
随笔-22 评论-7 文章-0 trackbacks-0
关于运行时类型识别typeid
在程序中,当我们对多态类的基类指针使用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
楚天清秋
阅读(703)
评论(0)
编辑
收藏
引用
所属分类:
C,C++
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
关于运行时类型识别typeid
cout重定向到文件 (转)
判断两个数组中是否存在相同的数字
浮点数在计算机中存储方式
关于sizeof(类)的大小
c++虚函数表探究
什么是智能指针(Solmyr 的小品文系列之五:垃圾收集)
template必须定义于头文件中[转]
如何判断文件是否存在?
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
<
2010年11月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
C,C++(9)
C++ Builder(2)
Java
Open Source(1)
VC++(2)
电脑故障(1)
生活拾趣(2)
算法(2)
重拾英语(1)
随笔档案
2010年11月 (1)
2010年9月 (2)
2010年8月 (1)
2010年7月 (4)
2010年6月 (7)
2010年5月 (3)
2010年4月 (4)
搜索
最新评论
1. re: BCB的RadioGroup控件的ItemIndex属性BUG!
用showmod.. 显示模式对话框看看。
要是还不行,就用hide,不用close。
似乎也见过。
--人渣
2. re: 关于sizeof(类)的大小
还是没明白。。。。
--楚天清秋
3. re: 关于sizeof(类)的大小
@heart168
同上
--Sunshine Alike
4. re: 关于sizeof(类)的大小
@楚天清秋
sorry sorry, 当时没细想就写了.
这个应该是内存对齐的原因吧,虚指针是只有一个,4字节.
情况2可能是因为多级继承会有额外字节记录this指针的偏移吧.
--Sunshine Alike
5. re: 关于sizeof(类)的大小
能否解释一下哪两个虚指针呢?
--heart168
阅读排行榜
1. 带非法字符的文件夹和文件的删除方法!(转)(3568)
2. cout重定向到文件 (转)(1789)
3. BCB的RadioGroup控件的ItemIndex属性BUG!(1699)
4. 判断两个数组中是否存在相同的数字(946)
5. 苹果引发的故事^_^(苹果习语的由来)(836)
评论排行榜
1. 关于sizeof(类)的大小(6)
2. BCB的RadioGroup控件的ItemIndex属性BUG!(1)
3. 常见开源协议(转) (0)
4. 求24点 (0)
5. cout重定向到文件 (转)(0)