小记:静默如初,安之若素
运行时的类型信息
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 }