• C++ 类的继承二(赋值兼容性原则)


    //赋值兼容性原则
    #include<iostream>
    using namespace std;
    
    class PointA{
    public:
        PointA(){
            x = 0;
            y = 0;
        }
        void Set(){
    
        }
    private:
        int x;
        int y;
    };
    
    class PointB :public PointA{
    public:
    private:
        int c;
    };
    
    /*
    自己猜想:
    赋值兼容性原则内部原理分析 在子类继承父类的时候,在子类的内存区域上,父类的元素会放在前面,子类的元素会放在父类元素后面 pa-> 类的-> 本质上是成员变量相对于类指针的偏移量 因为父类元素都在子类元素的前面 相当于子类前一部分就是一个父类对象 所以用父类偏移量取成员变量完全没有问题 这也说明子类继承父类,一定继承了父类的全部成员变量 包括私有成员变量 但是父类不可以代替子类 因为子类用许多父类没有的成员变量,如果按照子类的偏移量访问成员变量 就有可能访问不属于父类的内存空间 就会报错 */ void ProtectB(PointA pin){ } void ProtectA(){ PointA *pa = NULL; PointB pb; //父类可以用子类来赋值 pa = &pb; //父类可以用子类来初始化 PointA pa1(pb); //子类可以代替父类做形参 ProtectB(pb); //父类可以做子类的引用 PointA &pa2 = pb; } //总结:子类完全可以当父类用,但是父类不可以当子类使用 void main(){ system("pause"); }
    //赋值兼容性原则--原理验证
    #include<iostream>
    using namespace std;
    
    class PointA{
    public:
        PointA(){
            a = 1;
            b = 2;
        }
        int a;
        int b;
    };
    
    class PointB{
    public:
        PointB(){
            c = 3;
        }
        int c;
    };
    
    class PointC :public PointA, public PointB{
    public:
        PointC(){
            d = 4;
        }
        int d;
    };
    
    void ProtectA(){
        PointC pc;
        cout << "PointC类对象的地址是" << &pc << endl;
        cout << "----------------" << endl;
    }
    
    void main(){
        ProtectA();
        system("pause");
    }

  • 相关阅读:
    商场活动|简单易用|可下载试用|复用转盘抽奖软件
    js dictionary
    财务大写
    SET ANSI_NULLS ON ……
    批量生成clr脚本
    Git
    CTE递归查询
    jquery 巧用json传参
    个人犯的一个golang routine错误
    .NET实现自动编译
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5628323.html
Copyright © 2020-2023  润新知