C++中有很多关键字,作为程序猿一族,用的少可以原谅,但是不知道就有点儿说不过去了,所以来说说typeid关键字的作用:
主要作用是:返回指针或者引用所指对象的实际类型。
用法:
father *p=new father;
cout<<typeid(p).name(); //结果是:father *;
下面来看一个实例:
#include <iostream>
using namespace std;
class father
{
public:
int a ;
double b;
father()
{
}
virtual void show()
{
cout<<"father"<<endl;
}
};
class son:public father
{
public:
int c;
void show()
{
cout<<"son"<<endl;
}
son()
{
}
};
class grandson:public father
{
public:
void show()
{
cout<<"grandson"<<endl;
}
};
int main()
{
father a;
father *p=new father;
father &b=a;
father *p1=new son;
father *p2=new grandson;
cout<<sizeof(p)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(father)<<endl;
cout<<sizeof(p1)<<endl;
cout<<typeid(p1).name()<<endl;
cout<<typeid(*p1).name()<<endl;
cout<<typeid(*p2).name()<<endl;
system("pause");
return 0;
}
当show()函数没有加virtual时:其结果如下:
当将show()函数设置虚函数时:
可以看出返回的指针的实际类型都不一样,
由上面的代码可以看出:
son和grandson继承father类,此时有father类型的指针p1和p2,并且把son和grandson的首地址赋给p1和p2,因为father类中有虚函数show(),
所以typeid(p1)是class father*的,但是要是typeid(*p1)就是 class son类型的。返回的是他们的实际类型,但是如果没有virtual,则返回的都是calss father类型的;
如果要判断p1,p2....pn中的任意两个对象是不是一样的,就可以比较typeid(*p1)和typeid(*p2)是否相等。如果相等,那它们就是指向同一个对象。
BUT
如果是typeid(p1) != typeid(p2)的话,那他们是恒等的,因为都是class fatner *,,无论有么有virtual关键字;