C++学习总结21--运行时的类型信息

小记:静默如初,安之若素

运行时的类型信息

1. typeid操作符

#include <typeinfo>
typeid(类型/对象);

注:
返回typeinfo对象,用于描述类型信息,其中包含一个name的成员函数,可以将类型信息转换为字符串形式。
typeinfo提供了对”==“和”!=“操作符重载的支持,通过它们可以直接进行类型之间的比较。
 1 #include <iostream>
  2 #include <typeinfo>
  3 #include <cstring>
  4 using namespace std;
  5 
  6 class X
  7 { 
  8   virtual void foo(){}
  9 };
 10 
 11 class Y:public X
 12 { 
 13   void foo(){}
 14 };
 15 
 16 class Z:public X
 17 { 
 18   void foo(){}
 19 };
 20 
 21 
 22 void func(X &x)
 23 { 
 24   //if(!strcmp(typeid(x).name(), "1Y"))
 25   if(typeid(x) == typeid(Y))
 26   { 
 27     cout << "Process Y"<< endl;
 28   }
 29   //else if(!strcmp(typeid(x).name(), "1Z"))
 30   else if(typeid(x) == typeid(Z))
 31   { 
 32     cout << "Process Z" << endl;
 33   }
 34   else
 35   { 
 36     cout << "Process X" << endl;
 37   }
 38 }
 39 
 40 int main(void)
 41 { 
 42   int a;
 43   cout << typeid(int).name() << endl;//i
 44   cout << typeid(a).name() << endl;//i
 45   
 46   int arr[10];
 47   cout << typeid(arr).name() << endl;//A10_i
 48   
 49   int *p;
 50   cout <<typeid(p).name() << endl;//Pi
 51   
 52   int *arr1[10];
 53   int (*arr2)[10];
 54   cout << typeid(arr1).name() << endl;//A10_Pi
 55   cout << typeid(arr2).name() << endl;//PA10_i
 58   cout << typeid(int (*)(char)).name() << endl;//PFicE
 59   
 60   //类类型
 61   cout << typeid(Y).name() << endl;
 62   cout << typeid(Z).name() << endl;
 63 
 64   Y y;
 65   Z z;
 66   X x;
 67   func(y);
 68   func(z);
 69   func(x);
 70 
 71   return 0;
 72 }

2. 动态类型转换操作符

语法:目标类型变量 = dynamic_cast<目标类型>(源类型变量);

适用场景:
用于具有多态继承关系的父子类指针或引用的显示转换
注:在转换过程中,会检查目标对象的类型和期望转换的类型是否一致,如果一致转换成功,否则转换失败。如果转换的是指针,返回NULL表示失败,如果转换引用, 抛出”bad_cast“异常表示失败。

  1 #include <iostream>
  2 using namespace std;
  3 
  4 class A
  5 {
  6   virtual void foo(void){}
  7 };
  8 
  9 class B:public A
 10 {
 11   void foo(void){}
 12 };
 13 
 14 class C:public A
 15 {
 16   void foo(void){}
 17 };
 18 
 19 int main(void)
 20 {
 21   B b;
 22   A *pa = &b;
 23   //B *pb = static_cast<B*>(pa);
 24   //C *pc = static_cast<C*>(pa);
 25   B *pb = dynamic_cast<B*>(pa);
 26   C *pc = dynamic_cast<C*>(pa);//error
 27  
 28   cout << "pa = " << pa << endl;
 29   cout << "pb = " << pb << endl;
 30   cout << "pc = " << pc << endl;//NULL
 31 
 32   A &ra = b;
 33   C &rc = dynamic_cast<C&>(ra);//error
 34   
 35   return 0;
 36 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值