赋值兼容性总定义:在任何需要基类对象的地方都可以用公有派生类对象来代替。(把子给父)
原因:从现实中来看,公有意味着“是一个”,学生是一个人,反之不能这样说。
具体规则有三部分:
using namespace std;
class Person
{
string id;
string name;
public:
Person(string i, string na) :id(i), name(na){}
~Person(){}
};
class Student:public Person
{
string school;
public:
Student(string i, string na,string s) :Person(i,na), school(s){}
~Student(){}
void Print()const
{
cout << school << endl;
}
};
int main()
{
Person p1("20120343", "wanghe");
Student s1("20190917", "lilei", "LG");
p1 = s1; //1
Person* p = &p1; //2
p = &s1;
Person& per = s1; //3
return 0;
}
1、可以把子对象赋值给父对象
物理上会发生切片现象,只会把隐藏的父对象进行赋值。
反之不能把父对象给子对象,从逻辑上不能说人不是一个学生,并且子对象有一部分值属于不确定状态。
2、父对象指针可以指向子对象
只能识别子对象隐藏父对象的部分。
反之不行,如果将子对象指针指向父对象,并进行类型强转,如果子类新成员的类型是string,没有具体的这个类型,信息也没有指向堆区空间,发生崩溃;如果是int类,则打印乱码
3、子对象可以初始化父对象引用
只能引用子对象隐藏父对象