1. typeid操作符
1.1 typeid.name()
#include <iostream>
#include <typeinfo>
using namespace std;
int main(void){
int i;
cout << typeid(int).name() << "," << typeid(i).name() << endl;
int* a1[10];
int (*a2)[10];
cout << typeid(a1).name() << endl;
cout << typeid(a2).name() << endl;
}
$ ./a.out
i,i
A10_Pi
PA10_i
1.2 不同子类实现不同的处理方式
- 判断对象类型的前提: 对象之间要有多态的继承关系, 也就是说基类中是要有虚函数的, 子类中没有虚函数也可以
#include <iostream>
#include <typeinfo>
using namespace std;
class A{
public:
virtual void func() = 0;
};
class B:public A{
public:
void func(){
cout << "我是B子类" << endl;
}
};
class C:public A{
public:
void func(){
cout << "我是C子类" << endl;
}
};
void foo(A& a){
a.func();
if(typeid(a).name() == typeid(B).name()){
cout << "处理B子类的操作" << endl;
} else if(typeid(a).name() == typeid(C).name()){
cout << "处理C子类的操作" << endl;
}
}
int main(void){
B b;
C c;
foo(c);
foo(b);
}
$ ./a.out
我是C子类
处理C子类的操作
我是B子类
处理B子类的操作
2. 动态类型转换 dynamic_cast
- 可以在多态继承场景下,向下造型时,检查合理性。
- 动态: 即程序运行时检查。 静态: 编译器编译时完成的检查
#include <iostream>
#include <typeinfo>
using namespace std;
class A{
public:
virtual void func() = 0;
};
class B:public A{
public:
void func(){
cout << "我是B子类" << endl;
}
};
class C:public A{
public:
void func(){
cout << "我是C子类" << endl;
}
};
int main(void){
B b;
A* pa = &b;
B* pb = static_cast <B*>(pa);
C* pc = static_cast <C*>(pa);
C* pc_dynamic = dynamic_cast <C*>(pa);
cout << "pa: " << pa << endl;
cout << "pb: " << pb << endl;
cout << "pc: " << pc << endl;
cout << "pc_dynamic: " << pc_dynamic << endl;
}