C++ typeid操作符

typeid操作符用于判断表达式的类型,注意它和sizeof一样是一个操作符而不是函数。如果需要使用typeid操作符,最好加上typeinfo头文件。

给出以下定义

下表列出了使用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:


    
    
  1. class base
  2. {
  3. public :
  4. virtual void m(){cout<<"base"<<endl;}
  5. };
  6. class derived : public base
  7. {
  8. public:
  9. void m(){cout<<"derived"<<endl;}
  10. };
假设我们如本例所示定义了两个类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:
优酷账号更新30号

    
    
  1. class base
  2. {
  3. public :
  4. void m(){cout<<"base"<<endl;}
  5. };
  6. class derived : public base
  7. {
  8. public:
  9. void m(){cout<<"derived"<<endl;}
  10. };
假设我们根据例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)为真。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值