//赋值兼容性原则
#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");
}