运行类型识别
一、使用RTTI
dynamic_cast运算符的调用形式如下所示:
dynamic_cast<type*>(e) //e是指针 dynamic_cast<type&>(e) //e是左值 dynamic_cast<type&&>(e) //e是右值
e能成功转换为type*类型的情况有三种:
1)e的类型是目标type的公有派生类:派生类向基类转换一定会成功。
2)e的类型是目标type的基类,当e是指针指向派生类对象,或者基类引用引用派生类对象时,类型转换才会成功,当e指向基类对象,试图转换为派生类对象时,转换失败。
3)e的类型就是type的类型时,一定会转换成功。
1. 测试代码:
1 class Rect : public Shape { 2 public: 3 void fun() {}; 4 void prin() { cout << "我是方形" << endl; } 5 }; 6 7 class Circle : public Shape { 8 public: 9 void fun() {}; 10 void prin() { cout << "我是圆形" << endl; } 11 }; 12 13 void fun(Shape *p) 14 { 15 if (typeid(*p) == typeid(Rect)) 16 { 17 Rect *r = dynamic_cast<Rect *>(p); 18 r->prin(); 19 } 20 if (typeid(*p) == typeid(Circle)) 21 { 22 Circle *c = dynamic_cast<Circle *>(p); 23 c->prin(); 24 } 25 } 26 int main() 27 { 28 Rect r; 29 cout << "第一次执行fun函数:"; 30 fun(&r); 31 32 Circle c; 33 cout << "第二次执行fun函数:"; 34 fun(&c); 35 36 return 0; 37 }