zoukankan      html  css  js  c++  java
  • 子类与父类之间的类型转换

    先给一段代码

    class Base {
        public:
            int a = 10;
    };
    
    class pub_Derv : public Base {
        Base *getBase() {return this;}
    };
    
    class prot_Derv : protected Base {
        Base *getBase() {return this;}
    };
    
    class priv_Derv : private Base {
        Base *getBase() {return this;}
    };
    
    class pub_pub_Derv : public pub_Derv {
       Base *getBase() {return this;}
    };
    
    class pub_prot_Derv : public prot_Derv {
       Base *getBase() {return this;}
    };
    
    class pub_priv_Derv : public priv_Derv {
       //Base *getBase() {return this;}
    };

    1、对象类型不存在类型转换

    Base b;
    pub_Derv pd;
    b = pd;  // 是调用了Base的拷贝构造函数,而不是类型转换
    pd = b;  // 调用pub_Derv的拷贝赋值运算符,但是Base类型不能转为pub_Derv类型的引用,这个语句会报错。

    2、子类的指针或引用转为父类的指针或引用:子类--->父类

    不是子类的指针或引用就能转为父类的指针或引用,前提条件是子类的指针或引用在当前域(域内:类体类->成员函数和友元函数  域外:类体外)能够访问访问父类的public的成员,因为父类对象在域外就是能访问其public成员。

    子类对象在域外

    Base *p;
    p = new pub_Derv;     // 正确转换,Base的public成员在pub_Derv中还是public的,所以pub_Derv的域外对象能够访问Base的public成员。
    p = new prot_Derv;    // 错误转换,Base的public成员在prot_Derv中还是protected的,所以prot_Derv的域外对象不能访问Base的public成员。
    p = new priv_Derv;    // 错误转换,Base的public成员在priv_Derv中还是private的,所以priv_Derv的域外对象不能访问Base的public成员。
    p = new pub_pub_Derv;   // 正确转换,Base的public成员在pub_pub_Derv中还是public的,所以pub_pub_Derv的域外对象能够访问Base的public成员。
    p = new pub_prot_Derv;  // 错误转换,Base的public成员在pub_prot_Derv中是protected的,所以pub_prot_Derv的域外对象不能访问Base的public成员。
    p = new pub_priv_Derv;  // 错误转换,Base的public成员在pub_priv_Derv中是inaccessible的,所以pub_priv_Derv的域外对象不能访问Base的public成员。

    子类对象在域内

    class pub_prot_Derv : public prot_Derv {
        // 正确转换,Base的public成员在pub_prot_Derv中是protected的,pub_prot_Derv的域内对象能够访问pub_prot_Derv的protected成员,
        // 所以pub_prot_Derv的域内对象能转换为Base对象。
        Base *getBase() {return this;} 
    };
    
    class pub_priv_Derv : public priv_Derv {
        // 错误转换,因为Base的public成员在priv_Derv中是private的,到了pub_priv_Derv就变成inaccessible的了,也就是说在pub_priv_Derv的域内
        // 也访问不了Base的public成员,所以pub_priv_Derv的域内对象不能转换为Base对象。
        Base *getBase() {return this;} 
    };

    3、父类指针或引用转为子类指针或引用:父类--->子类

    Base *pb = new pub_Derv;
    // 父类指针或引用本来就是指向子类对象,则可以通过强制类型转换进行父类到子类的转换,来屏蔽编译器的检测,
    // 如果父类不是指向之类,而这样转换就很危险了。
    pub_Derv pb2 = static_case<pub_Derv>(pb); 
  • 相关阅读:
    POJ 1873 计算几何
    POJ 1584 计算几何
    POJ 1410 计算几何
    BZOJ 1208 set
    BZOJ 1503 splay
    BZOJ 5277 IQ题orz
    Codeforces Round #549 (Div. 2)A. The Doors
    (原创)同余定理
    April Fools Day Contest 2019 A. Thanos Sort
    PTA数据结构之 List Leaves
  • 原文地址:https://www.cnblogs.com/yuandonghua/p/11547956.html
Copyright © 2011-2022 走看看