C++中的关键字--typeid

来源:互联网 发布:博弈大师模拟软件 编辑:程序博客网 时间:2024/06/08 18:26

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关键字;



4 0
原创粉丝点击