类型兼容规则的常见情况:
(1)子类对象可以当作父类对象使用,也就是说子类对象可以无条件隐式类型转换为一个父类对象
(2)子类对象可以直接初始化或直接赋值给父类对象
(3)父类指针可以直接指向子类对象
(4)父类引用可以直接引用子类对象
// 基类 person, 派生类 man
// 子类对象赋值给父类对象
person *p = &mn1; // 类型兼容的,所以没有警告没有错误,person*和man*是类型兼容的
p->speak(); // 编译器在解析这句时,他认为p的类型是person*,所以p指向的一定就是一个person对象。
(5) 父类对象不能赋值给子类对象,但强制类型转换可以,不过强制转换极其危险,一旦调用了父类没有的方法,就会发生段错误。
// 2. 父类对象不能赋值给子类对象
man *p = &pn1; // 子类的指针,指向父类的对象,会怎么样?编译报错,因为编译器认为父类对象不能直接当做子类对象用
// 3. 父类强制转换为子类
man& rm = (man)pn1; // 极其危险,严重不推荐