一直不了解c++中如何判断一个实例的类别,只知道用typeid()就好,找了好多资料也都是说关于typeid()怎么用,对于原理很少谈到。
于是偶然间我发现了一句话 :
典型的RTTI是通过在VTABLE中放一个额外的指针来实现的。 (来源 http://blog.chinaunix.net/uid-20622737-id-3315150.html)。
恍然大悟,于是试验了一下。
class Fa{
public :
int a ;
Fa(){}
virtual int get(){
return a;
}
};
class Son : public Fa{
public :
Son(){}
};
在上面这份代码下,由于有虚函数,所以在实例中存在虚函数表指针,
Fa* fa = new Son();
printf("%s",typeid(*fa).name());
显示结果 *fa的类别是Son;
当我将Fa类改为
class Fa{
public :
int a ;
Fa(){}
// virtual int get(){
// return a;
// }
};
这时没有虚函数了,也就是说哪一个特殊的额外的指针没有地方放了,
此时结果 *fa的类别显示是Fa;
因此,我猜测当没有虚函数表指针时,编译器就静态处理typeid()函数(因为他根本就没存储本实例的具体类别信息),也就导致了当你没有虚函数时,typeid()的结果就不再准确。