存在继承关系的父子类之间,赋值兼容性原则子类可以当成父类使用

意味着子类(内涵更大)可以兼容父类(内涵更小),而父类不能兼容子类,即:

  • 子类对象可以直接赋值给父类对象

  • 子类对象可以直接初始化父类对象

  • 父类指针可以直接指向子类对象

  • 父类引用可以直接引用子类对象

class Base
{
protected:
    int m_base;
public:
    Base()
    {  }
};

class Derived : public Base
{
protected:
    int m_derived;
public:
    Derived()
    {  }
};

int main()
{
    Base b;
    Derived d;

    b = d;          //子类对象赋值给父类对象
    Base bb(d);     //子类对象初始化父类对象
    Base *p = &d;   //父类指针指向子类对象
    Base &r = d;    //父类引用引用子类对象

    //父类赋值给子类会发生什么?
    //d = b; 编译失败
    //Derived *f = &b; 编译失败

    return 0;
}