C++ Internals: VC RTTI - typeid
来源:互联网 发布:ubuntu怎么删除软件 编辑:程序博客网 时间:2024/05/21 10:21
在研究过VC的RTTI的基本结构之后,我们先来看看最简单的typeid是怎么实现的。
在VC中,当你对多态类的指针ptr使用typeid(*ptr)之后,编译器会做两件事情:首先是将指针进行调整,使它指向当前类的vftable处(注意,类的vftable未必处在类的开始),然后再调用__RTtypeid,返回type_info对象。我们可以试验一下下面的代码。
template<typename T>
const type_info &GetTypeID(const T *obj)
{
if (typeid(*obj)==*__RTtypeid(obj))
return typeid(*obj);
else
throw new std::bad_typeid("...");
}
template<typename T>
const TypeDescriptor *__RTtypeid(const T *ptr)
{
if (!ptr) throw new std::bad_typeid("Attempted a typeid of NULL pointer!");
const _s_RTTICompleteObjectLocator *pCompleteLocator=GetCompleteObjectLocator(ptr);
TypeDescriptor *pTypeDescriptor=pCompleteLocator->pTypeDescriptor;
if (!pTypeDescriptor) {
throw std::__non_rtti_object("Bad read pointer - no RTTI data!");
}
return pTypeDescriptor;
}
可以看到,typeid的实现很简单。
在VC中,当你对多态类的指针ptr使用typeid(*ptr)之后,编译器会做两件事情:首先是将指针进行调整,使它指向当前类的vftable处(注意,类的vftable未必处在类的开始),然后再调用__RTtypeid,返回type_info对象。我们可以试验一下下面的代码。
template<typename T>
const type_info &GetTypeID(const T *obj)
{
if (typeid(*obj)==*__RTtypeid(obj))
return typeid(*obj);
else
throw new std::bad_typeid("...");
}
template<typename T>
const TypeDescriptor *__RTtypeid(const T *ptr)
{
if (!ptr) throw new std::bad_typeid("Attempted a typeid of NULL pointer!");
const _s_RTTICompleteObjectLocator *pCompleteLocator=GetCompleteObjectLocator(ptr);
TypeDescriptor *pTypeDescriptor=pCompleteLocator->pTypeDescriptor;
if (!pTypeDescriptor) {
throw std::__non_rtti_object("Bad read pointer - no RTTI data!");
}
return pTypeDescriptor;
}
可以看到,typeid的实现很简单。
这是因为编译器会在类的vftable(包括它自己的和从基类继承的)的第一个函数指针前面插入一个指向_s_RTTICompleteObjectLocator结构的指针,这个结构中会存放该类的TypeDescriptor(上面的GetCompleteObjectLocator函数就是用来从vftable获得s_RTTICompleteObjectLocator结构的)。因此,即使你将派生类的指针赋给基类的指针,你仍然可以利用上面的算法得到派生类的类型。
转自:http://blog.csdn.net/vbvan/article/details/1907934
- C++ Internals: VC RTTI - typeid
- C++ Internals: VC RTTI - typeid
- C++ Internals: VC RTTI - 基本数据结构
- C++ Internals: VC RTTI - dynamic_cast (1)
- C++ Internals: VC RTTI - dynamic_cast (2)
- C++ Internals: VC RTTI - 基本数据结构
- C++ Internals: VC RTTI - dynamic_cast (1)
- C++ Internals: VC RTTI - dynamic_cast (2)
- C++ RTTI(typeid)
- RTTI与typeid
- RTTI(dynamic_cast与typeid)
- typeid及RTTI
- RTTI, dynamic_cast, typeid
- RTTI(typeid、dynamic_cast)
- RTTI 之 typeid 的使用
- C++中的RTTI 与typeid
- c++ 38 RTTI ,dynamic_cast ,typeid
- RTTI中dynamic_cast和typeid
- 成绩处理改进错误的地方是标准差的函数
- 【在线应用】全新的视觉盛宴——"动态影像服务目录 "
- Javascript学习系列(四):Javascript中最常用的61个经典技巧
- Linux设置环境变量小结
- Android Handler的使用2
- C++ Internals: VC RTTI - typeid
- Rsync进行数据同步
- 修改.gitconfg
- Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句(一)
- Ruby中用begin/end …rescue…ensure … raise 来处理异常
- centos中搭建bugzilla过程
- C++ Internals: VC RTTI - dynamic_cast (1)
- Chukwa 0.4.0 详细安装流程
- redis配置文件redis.conf