C++ typeid操作符
typeid 操作符用于判断表达式的类型,注意它和 sizeof 一样是一个操作符而不是函数。如果需要使用 typeid 操作符,最好加上 typeinfo 头文件。
给出以下定义:
	
		
操作符 typeid 返回的是一个 type_info 类(用于描述数据类型的一个系统类)对象的引用。这个操作符可以用于表达式和类型名(包括自定的数据类型,比如类)。
【例 1】
	
		
对于表达式 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】
	
		
对于表达式 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) 为真。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
			
			给出以下定义:
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) 为真。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
 
	