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