typeid关键词
typeid是c++的关键字,typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义)
ISO C++标准并没有确切定义type_info,它的确切定义编译器相关的,但是标准却规定了其实现必需提供如下四种操作:
type_info类提供了public虚 析构函数,以使用户能够用其作为基类。它的默认构造函数和拷贝构造函数及赋值操作符都定义为private,所以不能定义或复制type_info类型的对象。
程序中创建type_info对象的唯一方法是使用typeid操作符(由此可见,如果把typeid看作函数的话,其应该是type_info的 友元)
type_info的name成员函数返回C-style的字符串,用来表示相应的类型名,但务必注意这个返回的类型名与程序中使用的相应类型名并不一定一致,这具体由编译器的实现所决定的,标准只要求实现为每个类型返回唯一的字符串
typeid 的参数可以使指针,可以使对象,可以是普通变量等。
具体判断基类指针指向的类型方法如下:
类的定义:
class father
{
public:
virtual void fun()
{
cout<<"this is father fun call\n";
}
};
class son1: public father
{
public:
void fun()
{
cout<<"this is the son1 fun call\n";
}
};
class son2: public father
{
public:
void fun()
{
cout<<"this is the son2 fun call\n";
}
};
int main()
{
char sonstr[2][100];
//由于不知道编译器对typeid.name返回的字符串,因此预先保存好返回的字符串
strcpy(sonstr[0], typeid(son1).name());
strcpy(sonstr[1], typeid(son2).name());
father * pf;
son1 s1;
son2 s2;
pf = &s1;
if(strcmp(sonstr[0], typeid(*pf).name()) == 0)
{
cout<<"this is son1\n";
}
else if(strcmp(sonstr[1], typeid(*pf).name()) == 0)
{
cout<<"this is son2\n";
}
pf = &s2;
if(strcmp(sonstr[0], typeid(*pf).name()) == 0)
{
cout<<"this is son1\n";
}
else if(strcmp(sonstr[1], typeid(*pf).name()) == 0)
{
cout<<"this is son2\n";
}
return 0;
}
示例:
首先来看typeid操作符,其返回结果是名为type_info的标准库类型的对象的引用。type_info中存储特定类型的有关信息,定义在typeinfo头文件中。
下面来看typeid().name(),用于获得表达式的类型,以c-style字符串形式返回类型名。用法示例如下。
注意:对非引用类型,typeid().name()是在编译时期识别的,只有引用类型才会在运行时识别。
#include<iostream>
#include <typeinfo>
using namespace std;
class Class1{};
class Class2:public Class1{};
void fn0();
int fn1(int n);
int main(void)
{
int a = 10;
int* b = &a;
float c;
double d;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
cout << typeid(Class1).name() << endl;
cout << typeid(Class2).name() << endl;
cout << typeid(fn0).name() << endl;
cout << typeid(fn1).name() << endl;
cout << typeid(typeid(a).name()).name() << endl;
system("pause");
}
结果如下:
int
int *
float
double
class Class1
class Class2
void __cdecl(void)
int __cdecl(int)
char const *
请按任意键继续. . .
可以看到,typeid().name()可以返回变量、函数、类的数据类型名,功能是相当强大的。
cout << typeid(typeid(a).name()).name() << endl;可以看到结果为char const *,因此typeid().name()返回了存储类型名的字符串。