运行类型识别

一、使用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 }
View Code

相关文章:

  • 2022-02-08
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-14
  • 2021-08-12
猜你喜欢
  • 2022-12-23
  • 2021-11-13
  • 2021-10-13
  • 2021-08-10
  • 2022-01-28
  • 2021-08-19
相关资源
相似解决方案