首页 > 技术文章 > C++_day9am

lican0319 2019-04-29 10:49 原文

dynamic_cast

static_cast

reinterpret_cast

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class A{
 6 public:
 7     //动态类型转换只能用于多态继承
 8     virtual void foo(void){}
 9 };
10 
11 class B: public A{};
12 class C: public B{};
13 class D{};
14 
15 int main(void)
16 {
17     B b;
18     A* pa = &b; //B is a A --皆然性
19     cout << "pa= " << pa << endl;
20     cout << "动态类型装换" << endl;
21     //pa实际指向B类对象,转换成功
22     B* pb = dynamic_cast<B*> (pa);
23     cout << "pb= " << pb << endl;
24     //pa没有指向C类对象,转换失败,安全
25     C* pc = dynamic_cast<C*> (pa);
26     cout << "pc= " << pc << endl;
27     try{
28         A& ra = b;
29         C& rc = dynamic_cast<C&> (ra);
30     }
31     catch(exception& ex){
32         cout << ex.what() << endl;
33     }
34     //pa没有指向D类对象,转换失败,安全
35     D* pd = dynamic_cast<D*> (pa);
36     cout << "pd= " << pd << endl;
37     cout << "静态类型转换"  << endl;
38     //B是A的子类,转换成功
39     pb = static_cast<B*> (pa);
40     cout << "pb= " << pb << endl;
41     //C是A的孙子类,转换成功,危险
42     pc = static_cast<C*> (pa);
43     cout << "pc= " << pc << endl;
44     //D和A没有继承关系,转换失败,安全
45     //pd = static_cast<D*> (pa);
46     //cout << "pd= " << pd << endl;
47     cout << "重解释类型转换" << endl;
48     //编译期、运行期均不做检查,永远成功,最危险
49     pb = reinterpret_cast<B*> (pa);
50     cout << "pb= " << pb << endl;
51     pc = reinterpret_cast<C*> (pa);
52     cout << "pc= " << pc << endl;
53     pd = reinterpret_cast<D*> (pa);
54     cout << "pd= " << pd << endl;
55         
56     return 0;
57 }

 

 5.typeid.cpp

 1 #include <iostream>
 2 #include <typeinfo>
 3 
 4 using namespace std;
 5 
 6 namespace ns1{
 7     class A{
 8     public:
 9         class B{
10         public:
11             class C{};
12         };
13     };
14 }
15 class Base{
16     //virtual void foo(void){};
17 };
18 class Derived: public Base{};
19 
20 //class A{};
21 
22 int main(void)
23 {
24     int a = 0;
25     cout << typeid(int).name() << endl;                //i
26     cout << typeid(unsigned int).name() << endl;    //j
27     cout << typeid(char).name() << endl;              //c
28     cout << typeid(unsigned char).name() << endl;    //h
29     cout << typeid(short).name() << endl;            //s
30     cout << typeid(unsigned short).name() << endl;    //t
31     cout << typeid(long).name() << endl;            //l
32     cout << typeid(long long).name() << endl;        //x
33     cout << typeid(float).name() << endl;            //f
34     cout << typeid(double).name() << endl;            //d
35     cout << typeid(void).name() << endl;            //v
36     cout << typeid(bool).name() << endl;              //b
37     cout << typeid(int*).name() << endl;            //Pi
38     cout << typeid(int**).name() << endl;            //PPi
39     cout << typeid(int&).name() << endl;            //i
40     cout << typeid(float[4]).name() << endl;        //A4_f
41     cout << typeid(char*[4]).name() << endl;        //A4_Pc
42     cout << typeid(char(*)[4]).name() << endl;        //PA4_c
43     cout << typeid(short[2][3][4]).name() << endl;    //A2_A3_A4_s
44     cout << typeid(char*(*)(short*, int*)).name() << endl; //PFPcPsPiE
45     
46     struct Student{
47         char name[128];
48         int age;
49     };
50     cout << typeid(Student).name() << endl;            //Z4mainE7Student
51     cout << typeid(ns1::A::B::C).name() << endl;    //N3ns11A1B1CE
52     
53     Derived d;
54     Base* p = &d;
55     //基类中无虚函数
56     //cout << typeid(*p).name() << endl;                //4Base
57     //Base& r = d;
58     //cout << typeid(r).name() << endl;                //4Base
59     //基类中有虚函数:virtual void foo(void){};
60     cout << typeid(*p).name() << endl;                //7Derived
61     Base& r = d;
62     cout << typeid(r).name() << endl;
63     
64     return 0;
65 }

 6.shapes.cpp

 1 #include <iostream>
 2 #include <typeinfo>
 3 
 4 using namespace std;
 5 
 6 //形状:位置、绘制
 7 //+--圆形:半径、(绘制)
 8 //+--矩形:长宽、(绘制)
 9 //形状
10 class Shape{
11 public:
12         Shape(int x, int y): m_x(x), m_y(y){}
13         virtual void dummy(void){};
14         void draw(void) const{};        //纯虚函数
15     
16 protected:
17     int m_x;
18     int m_y;
19 };
20 
21 //圆形
22 class Circle: public Shape{
23 public:
24     Circle(int x, int y, int r): Shape(x, y), m_r(r){}
25     void draw(void) const
26     {
27         cout << "圆形(" << m_x << ',' << m_y << ',' << m_r << ')' << endl;
28     }
29 private:
30     int m_r;
31 };
32 
33 //矩形
34 class Rectangle: public Shape{
35 public:
36     Rectangle(int x, int y, int w, int h): Shape(x, y), m_w(w), m_h(h){}
37     void draw(void) const
38     {
39         cout << "矩形(" << m_x << ',' << m_y << ',' << m_w << ',' << m_h << ')' << endl;
40     }
41 private:
42     int m_w;
43     int m_h;
44 };
45 
46 void render(Shape* shapes[])
47 {
48     for(size_t i = 0; shapes[i]; ++i)
49         if(typeid(*shapes[i]) == typeid(Circle))
50             static_cast<Circle*> (shapes[i])->draw();
51         else
52         if(typeid(*shapes[i]) == typeid(Rectangle))
53             static_cast<Rectangle*> (shapes[i])->draw();
54 }
55 
56 void drawAny(Shape const& shape)
57 {
58     shape.draw();
59 }
60 
61 int main(void)
62 {
63     Shape* shapes[10] = {0};
64     shapes[0] = new Circle (1,2,3);
65     shapes[1] = new Circle(4,5,6);
66     shapes[2] = new Rectangle(7,8,9,10);
67     shapes[3] = new Rectangle(11,12,13,14);
68     shapes[4] = new Circle(15,16,17);
69     render(shapes);
70     
71     
72     return 0;
73 }

 7.dec.cpp

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Base{
 6 public:
 7     Base(void):m_array(new int[10])
 8     {
 9         cout << "基类构造" << endl;
10     }
11     virtual ~Base(void)
12     {
13         cout <<"基类析构" <<endl;
14         delete[] m_array;
15     }
16 private:
17     int* m_array;
18 };
19 
20 class Derived: public Base{
21 public:
22     Derived(void):m_buffer(new char[256])
23     {
24         cout << "子类构造" << endl;
25     }
26     ~Derived(void)
27     {
28         cout << "子类析构" << endl;
29         delete [] m_buffer;
30     }
31 private:
32     char* m_buffer;
33 };
34 
35 int main(void)
36 {
37     Base* pb = new Derived;
38     delete pb;    //在没有虚析构的情况下:基类函数不会调子类的析构函数
39                 //使用虚析构后:调用的是子类的析构函数,该析构函数一方面析构子类特有的资源
40                 //,另一方面还会自动调用基类的析构函数,最后连基类带子类所有的
41                 //资源全部析构干净。
42     
43     return 0;
44 }
45 //任何时候将基类的析构函数声明为虚函数,总不会有坏处

 

 虚析构:

任何时候将基类的析构函数声明为虚函数,总不会有坏处

    

推荐阅读