AlgebraMaster

Modern C++ 创造非凡 . 改变世界

导航

dynamics_cast<>

 1 #include <iostream>
 2 
 3 class A
 4 {
 5 public:
 6     A(){}
 7     ~A(){}
 8     virtual int data(){return 1;}
 9 };
10 class B:public A
11 {
12 public:
13     B(){}
14     ~B(){}
15     int data(){return 2;}
16 };
17 
18 class C:public A
19 {
20 public:
21     C(){}
22     ~C(){}
23     int data(){return 3;}
24 };
25 
26 class D:public C
27 {
28 public:
29     D(){}
30     ~D(){}
31     int data(){return 4;}
32 };
33 
34 int main()
35 {
36 
37     std::cout<<"dynamic_cast begin \n";
38     A *a=new A;
39     B *b=new B;
40     C *c=new C;
41     D *d=new D;
42 
43     if(dynamic_cast<B*> (a))   //this will fail  派生类不能指向基类
44     {
45         std::cout<<"A *a convert B class ok\n";
46     }
47 
48     if(dynamic_cast<A*> (b))    // this will be ok   基类指向派生类 ok
49     {
50         std::cout<<"B *b convert A class ok\n";
51     }
52 
53 
54     if(dynamic_cast<C*> (a))     // 派生类不能指向基类
55     {
56         std::cout<<"A *a convert C class ok\n";
57     }
58 
59     if(dynamic_cast<A*> (c))    //c派生类 所以可以被A指向
60     {
61         std::cout<<"A *a convert C class ok\n";
62     }
63 
64     if(dynamic_cast<A*> (d))    //  A <- C <- D   基类可以指向派生类 ok
65     {
66         std::cout<<"D *d convert A class ok\n";
67     }
68 
69     if(dynamic_cast<D*> (c))    // 派生类不能指向基类
70     {
71         std::cout<<"C *c convert D class ok\n";
72     }
73 
74     if(dynamic_cast<C*> (d))    // C基类可以指向派生类D ok
75     {
76         std::cout<<"D *d convert C class ok\n";
77     }
78 
79     if(dynamic_cast<D*> (d))    // ok
80     {
81         std::cout<<"d *d convert D class ok\n";
82     }
83 
84     std::cin.get();
85     return 0;
86 }

 

posted on 2015-09-04 01:09  gearslogy  阅读(270)  评论(0编辑  收藏  举报