zoukankan      html  css  js  c++  java
  • C++_day9am

    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 //任何时候将基类的析构函数声明为虚函数,总不会有坏处

     虚析构:

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

        

  • 相关阅读:
    .net core webapi发布到linux中
    封装EF,使用仓储模式所遇到的问题
    oracle取分组的前N条数据
    20141124
    搭建discuz论坛(2)
    安装apache mysql 论坛(一)
    L13 DNS
    L10 PUtty+SSH 访问vncviewer
    L12 samba服务器搭建
    L10 数据入站、转发、出站流程
  • 原文地址:https://www.cnblogs.com/lican0319/p/10789069.html
Copyright © 2011-2022 走看看