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");
}

原文地址:https://www.cnblogs.com/zhanggaofeng/p/5628323.html