您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> RTTI 存在哪?

RTTI 存在哪?

来源:网络整理     时间:2016/8/31 11:37:29     关键词:

关于网友提出的“ RTTI 存在哪?”问题疑问,本网通过在网上对“ RTTI 存在哪?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: RTTI 存在哪?
描述:


class A{};
就这么一个空类,typeid 这个函数是如何获得 type_info的?


解决方案1:

RTTI Complete Object Locator,不一定是第一项;
看编译器如何安排类和虚函数表的布局。

解决方案2:

引用 3 楼 xinsuerk9999 的回复:
Quote: 引用 2 楼 lm_whales 的回复:

不过是在代码中有 typeid ,这种使用 type_info的代码的时候。
编译器把符号表里的type_info相关的信息。
写一部分在目标代码中,然后  typeid从该部分代码中(可能是一个表格),读取type_info而已。
大概,只是,建立一个类型名,和类型信息的映射,而已。
不一定需要对象的信息。
当虚拟继承的时候,对象中可能会存储类型相关的信息,称为元数据。

情景1:
A *p = NULL;
const type_info &info = typeid(*p);
能拿到 正确的type_info。
情景2:
假设现有一个类继承结构,并且存在虚函数。
CBase *p = new CDerived;
const type_info &info = typeid(*p);
也能拿到 正确的type_info。因为在虚函数表中,第一项为RTTI Complete Object Locator的地址。
那就是说,情景1中,就是程序在编译期间,就已经确切的知道type_info,而情景2中,只能在运行期间决定出来?

应该是这样的。
不过VC6 不能完全支持typeid ,
当类带有虚函数的时候 ,比如
class Base{
int x;
public:
virtual ~Base(){cout<<"~Base()"<<><>
};
class Drived:public Base{
int y;
public:
virtual ~Drived(){cout<<"~Drived()"<<><>
};
Base* p = new Drived;的时候,
cout<<"type of p="<< typeid(*p).name()<<>
不能正确解析*p的类型----出现运行时错误。
而MFC 自己另外定义了一套 RTTI。
解决方案3:

不过是在代码中有 typeid ,这种使用 type_info的代码的时候。
编译器把符号表里的type_info相关的信息。
写一部分在目标代码中,然后  typeid从该部分代码中(可能是一个表格),读取type_info而已。
大概,只是,建立一个类型名,和类型信息的映射,而已。
不一定需要对象的信息。
当虚拟继承的时候,对象中可能会存储类型相关的信息,称为元数据。

解决方案4:

编译器生成代码……


以上介绍了“ RTTI 存在哪?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3679748.html

相关图片

相关文章