4.8 C++ typeid操作符
参考:http://www.weixueyuan.net/view/6378.html
总结:
typeid操作符用于判断表达式的类型,注意它和sizeof一样是一个操作符而不是函数。
如果需要使用typeid操作符,最好加上typeinfo头文件。
操作符typeid返回的是一个type_info类(用于描述数据类型的一个系统类)对象的引用。这个操作符可以用于表达式和类型名(包括自定的数据类型,比如类)。
typeid操作符用于判断表达式的类型,注意它和sizeof一样是一个操作符而不是函数。如果需要使用typeid操作符,最好加上typeinfo头文件。
给出以下定义
int a; double b; char * c; long d;
下表列出了使用typeid操作符的表达式的值:
表达式 | 值 |
---|---|
typeid(a) == typeid(int) | true |
typeid(a) == typeid(float) | false |
typeid(a) == typeid(int *) | false |
typeid(b) == typeid(double) | true |
typeid(b) == typeid(float) | false |
typeid(b) == typeid(long double) | false |
typeid(c) == typeid(char *) | true |
typeid(c) == typeid(char) | false |
typeid(c) == typeid(string) | false |
typeid(d) == typeid(long) | true |
typeid(d) == typeid(int) | false |
操作符typeid返回的是一个type_info类(用于描述数据类型的一个系统类)对象的引用。这个操作符可以用于表达式和类型名(包括自定的数据类型,比如类)。
例1:
class base { public : virtual void m(){cout<<"base"<<endl;} }; class derived : public base { public: void m(){cout<<"derived"<<endl;} };
假设我们如本例所示定义了两个类base类和derived类,基于这两个类定义,我们定义指针如下:
base * p = new derived;
下表将给出使用typeid操作符的结果。
表达式 | 值 |
---|---|
typeid(p) == typeid(base*) | true |
typeid(p) == typeid(derived*) | false |
typeid(*p) == typeid(base) | false |
typeid(*p) == typeid(derived) | true |
对于表达式typeid(p),因为p是base*类型的指针,因此typeid(p) == typeid(base*)为真,而typeid(p) == typeid(derived*)为假。而对于表达式typeid(*p),因为base类具有多态性,因而在计算typeid(*p)时会根据运行时p所指向的实际类型去计算,而本例中p指向的是派生类对象,因此表达式typeid(*p) == typeid(derived)为真,typeid(*p) == typeid(base)为假。
例2:
class base { public : void m(){cout<<"base"<<endl;} }; class derived : public base { public: void m(){cout<<"derived"<<endl;} };
假设我们根据例2中定义的两个类来定义如下指针:
base * p = new derived;
下表将给出使用typeid操作符的结果。
表达式 | 值 |
---|---|
typeid(p) == typeid(base*) | true |
typeid(p) == typeid(derived*) | false |
typeid(*p) == typeid(base) | true |
typeid(*p) == typeid(derived) | false |
对于表达式typeid(p),同样,因为p是base*类型的指针,因此typeid(p) == typeid(base*)为真,而typeid(p) == typeid(derived*)为假。而对于表达式typeid(*p),由于此时的基类不具有多态性,因而*p将会采用编译期类型来计算,编译期*p是base对象,因此表达式typeid(*p) == typeid(derived)为假,typeid(*p) == typeid(base)为真。