typeid的实现机制是怎样的
发布网友
发布时间:2022-05-18 04:22
我来回答
共2个回答
热心网友
时间:2023-10-09 05:16
typeid这是属于RTTI特性的一部分,意思是编译时编译器分析代码得到的变量类型信息保留到运行时,这样就可以在运行时动态知道数据的类型。不只是用虚函数的类,所有数据类型都可以。这种RTTI特性不止C++有,其他语言中也有所支持。请参考:
http://www.cnblogs.com/ustc11wj/archive/2012/08/11/2637319.html
但是typeid效率不高。如果想自己使用方便的话,建议:
在基类中添加一个int型成员变量(要public的),比如叫做type_id,然后在基类的构造函数中给这个type_id赋值为0;在派生类的构造函数中,将type_id赋值为1,2,…等等,每个派生类之间不要重复。这样只要访问type_id就可以知晓对象的类型了。这种方法的好处是不会增长虚函数表的长度,提高效率,但封装特性不佳(因为必须是public,外部可修改,但我们不要去改就好了)
另一种方式是添加一个函数,比如叫type_id,在基类中定义其返回0,而派生类中重载之,使其返回不同的数字。这样调用type_id函数就可以知道对象的类型。这种方法需要增加虚函数表的长度,但封装特性较好。追问你的办法通用性不好吧
标准是这样实现的
extern type_info example_info;
struct example
{
virtual type_info typeid()
{
return example_info
}
};
追答恩 看起来不错 不过”标准“是什么标准呢?可以给个出处吗?
热心网友
时间:2023-10-09 05:16
只有在基类中含有虚函数的时候typeid才会动态识别……追问类型信息放在哪里呢
追答虚函数是用对象中隐式含有指向虚函数表的指针来实现的,而类型信息和虚函数表放在一起,从而可以用指向虚函数表的指针加减一定的偏移量来访问……因此连虚函数表和指向这个表的指针都不存在,就不可能动态识别类型信息……